`
javamonkey
  • 浏览: 169413 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Spring-Dumpling,一个另外的开源小软件详细说明

阅读更多

 

除了分身做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 或者下载工程自个打包

放入 classpath

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 的值即可

 

五 应用场景说明

 

多台机器上只有一台能执行某个 job ,则使用 @RemoteSynronized 

主业务调用后会调用一些次要业务,不希望次要业务影响主业务的性能和牺牲可维护性 主业务使用 @Publish, 多个次业务使用 @Subscribe

数据需要同步到多台机器上,使用 @RemotePublish 和  @RemoteSubscriber 标签

数据需要交给远程的任一台机器处理,使用 @RemoteNotify 然后结合 @RemoteWait  标签一起用

主业务和次要业务处理后,还要求交给远端一个机器处理 可以在使用 @Publish,@Subscrbie 后,可以结合 @RemoteNotify @RemoteWait  来处理

 

 

 

欢迎使用和建议

分享到:
评论

相关推荐

    dumpling-0.2.zip

    这个开源项目,以.dumpling-0.2.zip的形式提供,包含了Dumpling的核心代码和相关资源,主要目的是帮助开发者深入理解和解决多线程程序中的复杂问题。本文将详细探讨Dumpling的主要功能、工作原理以及如何利用它进行...

    Dumpling Network Visualization Tool-开源

    【Dumpling网络可视化工具】是一个开放源代码的项目,主要设计用于帮助用户解析和分析网络数据包。这款工具基于PHP编程语言,并依赖于MySql数据库进行数据存储和管理,提供了一个直观的Web界面来展示网络流量信息。...

    my-dumpling-app:一站式饺子店

    该项目是通过引导的。可用脚本在项目目录中,可以运行:npm start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何棉绒错误。...

    谷歌师兄的leetcode刷题笔记-dumpling_chat:聊天机器人!!!

    为了研究自然语言处理的机器学习,我决定通过研究(东京的机器学习社区)的理论和代码来创建一个聊天机器人 我还得到了兄弟的帮助,为这个项目制作了一个 Web 应用程序。 我已经了解了这些很酷的虚拟助手的基本工作...

    twrp-3.3.1-0-twrp.img

    常用的recovery工具

    dumpling jump.exe

    dumpling jump.exe

    rice_dumpling.py

    rice_dumpling.py

    【小学英语】关于包饺子的小学生英语作文(三篇).doc

    以下是对这些文章中的英语知识点的详细说明: 1. **词汇积累**: - `dumplings` 饺子 - `flavor` 味道 - `knead` 揉面 - `dough` 面团 - `base` 基础 - `fillings` 馅料 - `Spring Festival` 春节 - `tops ...

    优秀资料(2021-2022年收藏)小学英语名词单数变复数规则及练习.doc

    这个过程涉及到一系列规则,帮助学生理解并记忆不同类型的名词如何转变为复数形式。以下是对这些规则的详细解释: 1. **一般规则**:大多数名词在词尾加-s来形成复数,如:desk -&gt; desks,girl -&gt; girls,boy -&gt; ...

    精品(2021-2022年)资料苏教版牛津重点小学英语五下单词表.doc

    这份资料是针对苏教版牛津小学五年级下学期的英语单词表,涵盖了多个单元的重要词汇,旨在帮助学生系统地学习和复习英语基础知识。以下是各单元的主要知识点: **Unit 1** 主要学习与人物、原因和服装相关词汇,如...

    初中英语单词分类记忆大全.doc

    - spring(春天) - summer(夏天) - autumn(秋天) - winter(冬天) 3. **方位**: - east(东) - south(南) - west(西) - north(北) - left(左) - right(右) 4. **交通工具**: - bike...

    台湾小吃英文名称(Word档含图文).doc

    这份文档详细列出了多种台湾地道小吃的英文名称,便于国际友人了解并品尝这些美味。以下是一些主要的台湾小吃及其英文翻译: 1. 早餐类: - 油条:Twisted Cruller 或 Fried Bread Stick - 燧饼:Baked Wheat ...

    外研版七年级上册Module 10 Spring Festival练习题及答案精选.doc

    这篇文档是针对初中一年级学生设计的一份关于外研版英语教材Module 10 Spring Festival的练习题及答案。模块主题围绕春节这一中国传统节日展开,旨在帮助学生提高英语水平,同时了解和学习中国文化。 在练习题中,...

    2020春五年级英语下册Unit7Chinesefestivals知识梳理新版牛津译林版20200428398

    7. January - 一月,一年的第一个月。 8. race - 比赛,如龙舟比赛。 9. songbird - 鸣鸟,与春天的生机勃勃相呼应。 10. February - 二月,春节通常在这个月庆祝。 11. place - 地方,指举行活动的场所。 12. knock...

Global site tag (gtag.js) - Google Analytics