欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一个新的小开源项目,spring-dumpling Spring dumpling 

程序员文章站 2022-06-06 14:52:15
...

介绍除了beetl外,在维护的另外一个小开源项目,spring-dumpling,提供一组注解来增强spring service的协作

一:协作服务
1 @CooperationService,类似于Spring的@Service
所有标记@CooperationService的类都将检查类方法里是否有如下annotation
@Publish / @Subscribe
@ClusterSync
@RemotePublish / @RemoteSubscriber
@RemoteNotify / @RemoteWait
@Process / @Task

2 @Publish,有如下属性
path: 一个逻辑路径,必须要
ruleExp: 根据输入值,输出值的表达式判断是否需要Publish,否则,总是通知其他机器. 如规则rule="returnValue==true",默认是发送
argExp:一个参数表达式列表,如果没有,则按照输入参数和输出参数作为参数列表,传递个sub。参数格式如:argExp="args0.orderId,args1,returnValue;"

@Subscribe
path: 一个逻辑路径,必须要
runPolicy: 运行时机,有俩个值,一个是sameTransacion,表示于publish方法在同一事物里,另外一个是afterCommint,这是默认值,表示当事物成功提交后异步执行,如果Publish没有在事物上下文里,则@publish方法执行完毕后立刻执行

3 @ClusterSync
path:一个逻辑路径,一旦机器(JVM)获取锁,将永久占有锁,机器宕机或者失去连接,将导致其他机器中的某一个占用
allowAcessAsFistTime: false或者true,默认false。如果为true,则允许第一次调用忽略锁

4 @RemotePublish,同Publish,但是发布到远程
path 一个路径
ruleEx: 根据输入值,输出值判断是否需要Notify,默认是returnValue!=null ,否则,总是通知其他机器.如规则rule="returnValue==true"
argExp:一个参数表达式列表,如果没有,则按照输入参数和输出参数作为参数列表,传递个sub。参数格式如:argExp="arg0=input0.orderId;arg1=input0.cash;arg2=returnValue;"

@RemoteSubscriber
path:一个路径。

5 @RemoteNotify,远程只能有一个被执行
path 一个路径
rule: 根据输入值,输出值的表达式判断是否需要Notify,否则,总是通知其他机器. 如规则rule="returnValue==true",默认是发送
argExp:一个参数表达式列表,如果没有,则按照输入参数和输出参数作为参数列表,传递个sub。参数格式如:argExp="arg0=input0.orderId;arg1=input0.cash;arg2=returnValue;"
@RemoteWait ,
path:一个路径。

6 @Process
@Task待定

二:协作服务提供者

每组annotation可以有自己的协作服务提供者,或者共用一种协作服务提供者(如果服务提供者都支持)。
协作服务提供时机应该是系统启动成功后(也包括系统各个组件初始化成功后)
Remote的协作服务实现可以通过JMS,ZK,甚至数据库表共享来实现。推荐使用ZK,但ZK 对RemotePublish 支持并不好。不适合线上业务,只适合一些数据同步和管理功能。
@Publish,@Process是基于Local的,则不需一个第三方协作服务提供者。

三:协作服务发现:

通过Spring的机制PostProcessor,首先找到注解为@CooperationService的类,然后依次遍历方法,可以发现这些需要服务的方法和类
也能适合别的框架,如没有spring的情况

四 协作者
分为发起方和接收方,通过申明annotation,可以实现协作。也可以直接在代码里调用协作服务API以满足发起方的灵活性要求.如一个方法体里需要俩次Publish到不同地方
PublicService pub = ctx.get("CooperationService-Pub");pub.send(path1, arglist),pub.send(path2,arglist2)

五 应用场景说明

1 多台机器上只有一台能执行某个job,则使用@RemoteSynronized
2 主业务调用后会调用一些次要业务,不希望次要业务影响主业务的性能和牺牲可维护性 主业务使用@Publish,多个次业务使用@Subscribe。
3 数据需要同步到多台机器上,使用@RemotePublish和 @RemoteSubscriber标签
4 数据需要交给远程的任一台机器处理,使用@RemoteNotify然后结合@RemoteWait 标签一起用
5 主业务和次要业务处理后,还要求交给远端一个机器处理 可以在使用@Publish,@Subscrbie后,可以结合@RemoteNotify,@RemoteWait 来处理

 

有兴趣可以关注 http://sourceforge.net/p/spring-dumpling/wiki/Home/  过一阵子会提供更完善的文档和例子

相关标签: Spring dumpling