除了分身做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
做如下配置即可
<!--
springdumpling
配置 -->
<
bean
id
=
"spring-dumpling"
class
=
"com.bee.spring.dumpling.SpringBowl"
>
<
property
name
=
"psProvider"
ref
=
"defaultPublisScribeProvider"
/>
<!--
<property name="nwProvider"
ref
="jmsNotifyWaitProvider" />
<property name="remotePSProvider"
ref
="jmsRemotePSProvider" />
<property name="clusterSyncProvider"
ref
="zkClusterSyncProvider" />
-->
</
bean
>
<
bean
id
=
"defaultPublisScribeProvider"
class
=
"com.bee.spring.dumpling.DefaultPSProviderImpl"
/>
<
bean
id
=
"zkClusterSyncProvider"
class
=
"com.bee.spring.dumpling.ZkClusterSyncProvider"
>
<
property
name
=
"zkConf"
ref
=
"zkConf"
/>
</
bean
>
<
bean
id
=
"jmsNotifyWaitProvider"
class
=
"com.bee.spring.dumpling.jms.activemq.JMSNotifyWaitProvider"
>
<
property
name
=
"jmsConf"
ref
=
"jmsConf"
/>
</
bean
>
<
bean
id
=
"jmsRemotePSProvider"
class
=
"com.bee.spring.dumpling.jms.activemq.JMSRemotePSProvider"
>
<
property
name
=
"jmsConf"
ref
=
"jmsConf"
/>
</
bean
>
<!--
zk
配置 -->
<
bean
id
=
"zkConf"
class
=
"com.bee.spring.dumpling.clustersync.zk.ZKConf"
>
<
property
name
=
"server"
value
=
"127.0.0.1:2181"
/>
<!-- <property name="useACL" value="1"/> -->
</
bean
>
<!-- JMS消息配置 -->
<
bean
id
=
"jmsConf"
class
=
"com.bee.spring.dumpling.jms.activemq.JmsConfig"
>
<
property
name
=
"url"
value
=
"failover://(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617)?randomize=false"
/>
</
bean
>
<!-- enable
aop
-->
<
aop:aspectj-autoproxy
/>
<!-- <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" /> -->
<
context:component-scan
base-package
=
"com.netease"
/>
<!--
springdumpling
配置结束 -->
|
目前采用ZK
作为
ClusterSync
的协调服务提供者,
ActivityMQ
作为
RemotePublish
,
RemoteNotify
的服务提供者
三、
使用
1.
@CooperationService
需要实现协调服务的类,必须在类上申明@CooperationService
,如下例子
@CooperationService
@Service
public
class
UserServiceImpl
implements
UserService ,ApplicationContextAware
{
|
|
2.
@Publish / @Subscribe
@Publish,有如下属性
path: 一个逻辑路径,必须要
ruleExp: 根据输入值,输出值的表达式判断是否需要
Publish,
否则,总是通知其他机器
.
如规则
rule="returnValue==true"
,默认是发送
argExp:一个参数表达式列表,如果没有,则按照输入参数和输出参数作为参数列表,传递个
sub
。参数格式如:
argExp="args[0].orderId,args[1],returnValue;
@Transactional
@Publish
(path =
"/user/
login
"
, ruleExp =
"returnValue!=null"
, argExp =
"args[0],returnValue"
)
public
UserVo updateLoginTime(String userName)
{
System.
out
.println(
"update login userName for "
+ userName);
userDao
.updateLoginTime(userName);
return
userDao
.login(userName);
}
|
|
@Subscribe
path: 一个逻辑路径,必须要
runPolicy: 运行时机,有俩个值,一个是
sameTransacion,
表示于
publish
方法在同一事物里,另外一个是
afterCommint,
这是默认值,表示当事物成功提交后异步执行,如果
Publish
没有在事物上下文里,则
@publish
方法执行完毕后立刻执行
@Subscribe
(path =
"/user/
login
"
,runPolicy=
Subscribe
.
AFTER_COMMIT
)
@Transactional
public
void
auditLogin(String name, UserVo vo)
{
//do nothing,just log
System.
out
.println(
"user "
+ vo.getName() +
"last login time:"
+ vo.getLastLoginTime()
+
" in subscribe UserCreditServiceImpl.auditLogin"
);
userCreditDao
.addLoginTimes(name);
//
throw new UnsupportedOperationException("just test,no roll back");
}
|
|
3.
@ClusterSync
path:一个逻辑路径,一旦机器(
JVM
)获取锁,将永久占有锁,机器宕机或者失去连接,将导致其他机器中的某一个占用
allowAcessAsFistTime: false或者
true
,默认
false
。如果为
true
,则允许第一次调用忽略锁
@ClusterSync(path="/testsys/job/xxxjob")
Public void doit(){
|
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
:是否持久化消息
@RemotePublish
(path =
"/user/age12"
, argExp =
"args[0],args[1]"
)
public
void
updateAge(String userName,
int
age)
{
System.
out
.println(
"update age"
+ userName +
","
+ age);
}
|
@RemoteSubscriber
path:一个路径。
@RemoteSubscribe
(path =
"/user/age12"
)
public
void
addAge(String userName,
int
age)
{
System.
out
.println(
"add age "
+ userName +
","
+ age);
}
|
5.
@RemoteNotify / @RemoteWait
@RemoteNotify,远程只能有一个被执行
path 一个路径
rule: 根据输入值,输出值的表达式判断是否需要
Notify
,否则,总是通知其他机器
.
如规则
rule="returnValue==true"
,默认是发送
argExp:一个参数表达式列表,如果没有,则按照输入参数和输出参数作为参数列表,传递个
sub
。参数格式如:
argExp="arg0=input[0].orderId;arg1=input[0].cash;arg2=returnValue;"
p
ersisit
:是否持久化消息
@
RemoteNotify(path=
"/test/mq2"
,persisit=
true
)
public
void
sendMsg(String str){
sendList.add(str);
}
|
@RemoteWait ,
path:一个路径。
@RemoteWait
(path=
"/test/mq2"
)
public
void
receiveMsg(String str){
receiverList
.add(str);
}
|
四、
协作服务安装
每组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
来处理
欢迎使用和建议
分享到:
相关推荐
这个开源项目,以.dumpling-0.2.zip的形式提供,包含了Dumpling的核心代码和相关资源,主要目的是帮助开发者深入理解和解决多线程程序中的复杂问题。本文将详细探讨Dumpling的主要功能、工作原理以及如何利用它进行...
【Dumpling网络可视化工具】是一个开放源代码的项目,主要设计用于帮助用户解析和分析网络数据包。这款工具基于PHP编程语言,并依赖于MySql数据库进行数据存储和管理,提供了一个直观的Web界面来展示网络流量信息。...
该项目是通过引导的。可用脚本在项目目录中,可以运行:npm start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何棉绒错误。...
为了研究自然语言处理的机器学习,我决定通过研究(东京的机器学习社区)的理论和代码来创建一个聊天机器人 我还得到了兄弟的帮助,为这个项目制作了一个 Web 应用程序。 我已经了解了这些很酷的虚拟助手的基本工作...
常用的recovery工具
dumpling jump.exe
rice_dumpling.py
以下是对这些文章中的英语知识点的详细说明: 1. **词汇积累**: - `dumplings` 饺子 - `flavor` 味道 - `knead` 揉面 - `dough` 面团 - `base` 基础 - `fillings` 馅料 - `Spring Festival` 春节 - `tops ...
这个过程涉及到一系列规则,帮助学生理解并记忆不同类型的名词如何转变为复数形式。以下是对这些规则的详细解释: 1. **一般规则**:大多数名词在词尾加-s来形成复数,如:desk -> desks,girl -> girls,boy -> ...
这份资料是针对苏教版牛津小学五年级下学期的英语单词表,涵盖了多个单元的重要词汇,旨在帮助学生系统地学习和复习英语基础知识。以下是各单元的主要知识点: **Unit 1** 主要学习与人物、原因和服装相关词汇,如...
- spring(春天) - summer(夏天) - autumn(秋天) - winter(冬天) 3. **方位**: - east(东) - south(南) - west(西) - north(北) - left(左) - right(右) 4. **交通工具**: - bike...
这份文档详细列出了多种台湾地道小吃的英文名称,便于国际友人了解并品尝这些美味。以下是一些主要的台湾小吃及其英文翻译: 1. 早餐类: - 油条:Twisted Cruller 或 Fried Bread Stick - 燧饼:Baked Wheat ...
这篇文档是针对初中一年级学生设计的一份关于外研版英语教材Module 10 Spring Festival的练习题及答案。模块主题围绕春节这一中国传统节日展开,旨在帮助学生提高英语水平,同时了解和学习中国文化。 在练习题中,...
7. January - 一月,一年的第一个月。 8. race - 比赛,如龙舟比赛。 9. songbird - 鸣鸟,与春天的生机勃勃相呼应。 10. February - 二月,春节通常在这个月庆祝。 11. place - 地方,指举行活动的场所。 12. knock...