精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | |||||||||||
发表时间:2012-07-20
最后修改:2012-07-20
除了分身做beetl(http://beetl.sourceforge.net/) 外,实际上还做了一个Spring相关的,技术含量不高,但还是很有用。所以推荐给大家
一、 概述Spring-Dumpling(简称 SD) 是在基于 Spring 框架下的提供协作服务,正如 Spring 自带的 @Service,SD 提供 @CooperationService 以及如下注解: @Publish / @Subscribe @ClusterSync @RemotePublish / @RemoteSubscriber @RemoteNotify / @RemoteWait @Process / @Task 来完成业务方法的协作。 二、 安装:1 https://sourceforge.net/projects/spring-dumpling/ 下载最新版本spring-dumpling.0.1.jar 或者下载工程自个打包 2 放入 classpath 里 3 在 spring 做如下配置即可
目前采用ZK 作为 ClusterSync 的协调服务提供者, ActiveMQ 作为 RemotePublish , RemoteNotify 的服务提供者
三、 使用
1. @CooperationService需要实现协调服务的类,必须在类上申明@CooperationService ,如下例子
2. @Publish / @Subscribe@Publish,有如下属性 path: 一个逻辑路径,必须要 ruleExp: 根据输入值,输出值的表达式判断是否需要 Publish, 否则,总是通知其他机器 . 如规则 rule="returnValue==true" ,默认是发送 argExp:一个参数表达式列表,如果没有,则按照输入参数和输出参数作为参数列表,传递个 sub 。参数格式如: argExp="args[0].orderId,args[1],returnValue;
@Subscribe path: 一个逻辑路径,必须要 runPolicy: 运行时机,有俩个值,一个是 sameTransacion, 表示于 publish 方法在同一事物里,另外一个是 afterCommint, 这是默认值,表示当事物成功提交后异步执行,如果 Publish 没有在事物上下文里,则 @publish 方法执行完毕后立刻执行
3. @ClusterSyncpath:一个逻辑路径,一旦机器( JVM )获取锁,将永久占有锁,机器宕机或者失去连接,将导致其他机器中的某一个占用 allowAcessAsFistTime: false或者 true ,默认 false 。如果为 true ,则允许第一次调用忽略锁
4. @RemotePublish / @RemoteSubscriber@RemotePublish,同 Publish ,但是发布到远程 path 一个路径 ruleEx: 根据输入值,输出值判断是否需要 Notify ,默认是 returnValue!=null ,否则,总是通知其他机器 . 如规则 rule="returnValue==true" argExp:一个参数表达式列表,如果没有,则按照输入参数和输出参数作为参数列表,传递个 sub 。参数格式如: argExp="arg0=input[0].orderId;arg1=input[0].cash;arg2=returnValue;" p ersisit :是否持久化消息
@RemoteSubscriber path:一个路径。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
||||||||||||
返回顶楼 | ||||||||||||
发表时间:2012-07-20
1、ActiveMQ拼写错了。
2、没搞清楚可以用来做什么,好像文档没发完,被截断了 |
||||||||||||
返回顶楼 | ||||||||||||
发表时间:2012-07-20
最后修改:2012-07-20
5. @RemoteNotify / @RemoteWait@RemoteNotify,远程只能有一个被执行 path 一个路径 rule: 根据输入值,输出值的表达式判断是否需要Notify,否则,总是通知其他机器. 如规则rule="returnValue==true",默认是发送 argExp:一个参数表达式列表,如果没有,则按照输入参数和输出参数作为参数列表,传递个sub。参数格式如:argExp="arg0=input[0].orderId;arg1=input[0].cash;arg2=returnValue;" persisit:是否持久化消息
@RemoteWait , path:一个路径。
四、协作服务安装
每组annotation可以有自己的协作服务提供者,或者共用一种协作服务提供者(如果服务提供者都支持)。 协作服务提供时机应该是系统启动成功后(也包括系统各个组件初始化成功后) Remote的协作服务实现可以通过JMS,ZK,甚至数据库表共享来实现。推荐使用ZK,但ZK 对RemotePublish 支持并不好。不适合线上业务,只适合一些数据同步和管理功能。 @Publish,@Process是基于Local的,则不需一个第三方协作服务提供者。
@ClusterSync 使用了Zookeeper,只需要安装Zookeeper,并在配置文件中指定server的IP地址即可 @RemotePublis @RemoteNotify使用了ActivyMQ,同样只需要安装好MQ,并设定URL的值即可
五 应用场景说明
1 多台机器上只有一台能执行某个job,则使用@RemoteSynronized 2 主业务调用后会调用一些次要业务,不希望次要业务影响主业务的性能和牺牲可维护性 主业务使用@Publish,多个次业务使用@Subscribe。 3 数据需要同步到多台机器上,使用@RemotePublish和 @RemoteSubscriber标签 4 数据需要交给远程的任一台机器处理,使用@RemoteNotify然后结合@RemoteWait 标签一起用 5 主业务和次要业务处理后,还要求交给远端一个机器处理 可以在使用@Publish,@Subscrbie后,可以结合@RemoteNotify,@RemoteWait 来处理
|
||||||||||||
返回顶楼 | ||||||||||||
发表时间:2012-07-20
没想到超长了,分俩个发出来了,
kimmking,我记得你,上次对我的beetl有过负面看法...... |
||||||||||||
返回顶楼 | ||||||||||||
发表时间:2012-07-20
javamonkey 写道 没想到超长了,分俩个发出来了, kimmking,我记得你,上次对我的beetl有过负面看法...... 只能说您老这记性。。。 我们对调优的看法有分歧。 我只称赞过beetl, 并且给你说文档上的日期当时写错了。 where is 负面看法?? |
||||||||||||
返回顶楼 | ||||||||||||
发表时间:2012-07-20
kimmking 写道 javamonkey 写道 没想到超长了,分俩个发出来了,
kimmking,我记得你,上次对我的beetl有过负面看法...... 只能说您老这记性。。。 我们对调优的看法有分歧。 我只称赞过beetl, 并且给你说文档上的日期当时写错了。 where is 负面看法?? 还是好兄弟 |
||||||||||||
返回顶楼 | ||||||||||||
发表时间:2012-07-20
kimmking 写道 javamonkey 写道 没想到超长了,分俩个发出来了,
kimmking,我记得你,上次对我的beetl有过负面看法...... 只能说您老这记性。。。 我们对调优的看法有分歧。 我只称赞过beetl, 并且给你说文档上的日期当时写错了。 where is 负面看法?? o,确实,我记错了。 谢谢你指出当时的问题这这个帖子的问题 |
||||||||||||
返回顶楼 | ||||||||||||
浏览 2927 次