`
我想我是海
  • 浏览: 212565 次
社区版块
存档分类
最新评论

Jencks2.0 + activeMQ4.1 使用手记

    博客分类:
  • jms
阅读更多
自打Spring2出来后一直使用其自带的MDP功能,当时使用的JMS产品是Joram,后来实在受不了Joram持久化机制和莫名其妙的不能启动服务器等,狠一狠心换成口碑日佳的ActiveMQ。ActiveMQ在使用方面竟比我想像中的简单!但这种简单来得可不简单,你需要反复翻他的文档。搞了好久后看着那简洁的配置和不用提心吊胆的Server,真有相见恨晚的感觉。
使用ActiveMQ,很难不知道有Jencks这个东西。我在之前只是简单的知道该JCA产品可以实现Message driven Pojo,但想想Spring也能做到的东西我为什么用另一套,看了Jencks的FAQ就清楚了:
www.jencks.org/How+does+Jencks+compare+to+Springs+MDPs
偶翻译能力太差,大概了解但不知道要乍讲。看官们还是自个看看吧:P。

Jencks2.0版本的配置比1.X的配置来得清爽很多。
1.X版本的可参考Springside的Wiki (XSD版):
http://www.jencks.org/How+does+Jencks+compare+to+Springs+MDPs
另外可以参考Javaeye另一位仁兄的尝试(Spring  Bean版 ):
jamsa.iteye.com/blog/post/168023
Jamsa的示例中只演示了Inboud 的情况,实际上Jencks是可以包括Inbound outbound的Message的。

我的目标是使用Jencks2.0实现MDP及对Outbound Message的管理,参考官方文档很快可以把配置做出来:
www.jencks.org/Message+Driven+POJOs
www.jencks.org/Outbound+JMS

贴一下我的配置文件全貌:
xml 代码
 
  1. xml version="1.0" encoding="UTF-8"?>  
  2.     "http://www.springframework.org/dtd/spring-beans-2.0.dtd">  
  3.   
  4. <beans>  
  5.     <!---->  
  6.     <bean id="jmsTransactionManager"  
  7.         class="org.jencks.factory.TransactionManagerFactoryBean" />  
  8.           
  9.     <!---->  
  10.     <bean id="connectionManager"  
  11.         class="org.jencks.factory.ConnectionManagerFactoryBean">  
  12.         <property name="transactionManager" ref="jmsTransactionManager" />  
  13.     <!---->bean>  
  14.   
  15.     <bean id="jmsResourceAdapter"  
  16.         class="org.apache.activemq.ra.ActiveMQResourceAdapter">  
  17.         <property name="serverUrl">  
  18.             <value>tcp://localhost:61616<!---->value>  
  19.         <!---->property>  
  20.     <!---->bean>  
  21.   
  22.     <bean id="jmsManagedConnectionFactory"  
  23.         class="org.apache.activemq.ra.ActiveMQManagedConnectionFactory">  
  24.         <property name="resourceAdapter" ref="jmsResourceAdapter" />  
  25.     <!---->bean>  
  26.   
  27.     <bean id="connectionFactory"  
  28.         class="org.jencks.factory.ConnectionFactoryFactoryBean">  
  29.         <property name="managedConnectionFactory"  
  30.             ref="jmsManagedConnectionFactory" />  
  31.         <property name="connectionManager" ref="connectionManager" />  
  32.     <!---->bean>  
  33.     <!---->  
  34.       
  35.     <!---->  
  36.     <bean id="jmsTemplate"  
  37.         class="org.springframework.jms.core.JmsTemplate">  
  38.         <property name="connectionFactory">  
  39.             <ref bean="connectionFactory" />  
  40.         <!---->property>  
  41.     <!---->bean>  
  42.   
  43.     <bean id="sender" class="net.jf.activemq.Sender">  
  44.         <property name="jmsTemplate" ref="jmsTemplate" />  
  45.         <property name="queue">  
  46.             <value>queue.text<!---->value>  
  47.         <!---->property>  
  48.     <!---->bean>  
  49.     <!---->  
  50.       
  51.     <!---->  
  52.     <bean id="receiver" class="net.jf.activemq.Receiver" /> <!---->
  53.   
  54.     <bean id="jencks" class="org.jencks.JCAContainer">  
  55.         <property name="transactionManager" ref="jmsTransactionManager" />  
  56.         <property name="threadPoolSize" value="25" />  
  57.   
  58.         <!---->  
  59.         <property name="resourceAdapter" ref="jmsResourceAdapter" />  
  60.     <!---->bean>  
  61.   
  62.     <bean id="inboundConnectorA" class="org.jencks.JCAConnector">  
  63.         <property name="jcaContainer" ref="jencks" />  
  64.         <!---->  
  65.         <property name="activationSpec">  
  66.             <bean  
  67.                 class="org.apache.activemq.ra.ActiveMQActivationSpec">  
  68.                 <property name="destination" value="queue.text" />  
  69.                 <property name="destinationType"  
  70.                     value="javax.jms.Queue" />  
  71.             <!---->bean>  
  72.         <!---->property>  
  73.         <property name="ref" value="receiver" />  
  74.     <!---->bean>  
  75.     <!---->  
  76. <!---->beans>  
注意inbound 及outboud的资源适配器使用相同的适配器。多数情况下,JMS的发送方及接收方配置分开,但注意当同时使用Jencks管理发送消息方及接收方时,要保持resourceAdepter的一致!

还一件事你一定要知道。要不你会跟我一样抓狂上好几天。就是Jencks2.0的依赖包的问题。
找遍Jencks2.0下载回来的包,其实还是差两个很重要的包。那就是geronimo-transaction和geronimo-connector包。而Jencks官网对此没有提及,很郁闷。
我在寻找这两个包的过程中下编了geronimo的几个版本都没发现,然后到这里找到他们的1.1版本。运行时发现缺少类,该类是属于Transaction包内的类,分明包内没有此类:\org\apache\geronimo\transaction\manager\XAWork。Google一下,结果奇少。我想应该是包版本问题,而Maven的仓库只有1.2Beta版本的,我下来一看也没这个类,于是没有替换掉,继续使用1.1版。
后来找到这个类是Transatction包的2.0版本才有的,我赶紧SVN了Geronimo最新的源码回来,自己Build了个快照的版本。其实是两个:
geronimo-connector-2.0-SNAPSHOT.jar
geronimo-transaction-1.2-SNAPSHOT.jar
而后来发生的问题几乎要推翻我的Java信仰。运行时报的错是NoSuchMethodError,告诉我缺少一个方法。而分明那个类,那个方法是存在的。我很确定在我的类库里,这个类只存在一个版本。我实在没有办法了,我开始怀疑2.0的成熟性。但是还没有放弃最后的希望,我又SVN了一份Jencks的最新代码回来。用Maven跑一跑,所有测试都没问题。而这时发现它只是用了Transaction及Connector的1.2的包。我决定最后一博,把这两个包替换掉2.0的包。奇迹啊,哥们,终于久违的“Hello activeMQ”打印了出来。
至今我还没想明白怎么现在又不报缺XAWork?为什么存在的方法是被报不存在?不过最后终于跑起来了,很爽。
所以不要怪我上面那一番没章法的抱怨。这样的问题让我几近崩溃。我觉得我有必要把过程写出来与大家分享。让后来的朋友能快速地解决问题。
实际上,我在看MailList的时候看到过一封类似问题的邮件,我其实只要按方法用1.2换掉1.1的Connector和Trasaction就得了。但我死活认为非要找到XAWork的包才行。而最后解决的方法却是没必要找到XAWork的包。额滴神啊。我现在还想不明白为啥。望哪位看官能指点迷津!
最后附上我的Lib(这是最重要D):
activeio-core-3.0.0-incubator.jar
activemq-console-4.1.1.jar
activemq-core-4.1.1.jar
activemq-core-4.1.1-tests.jar
activemq-jaas-4.1.1.jar
activemq-ra-4.1.1.jar
activemq-web-4.1.1.jar
backport-util-concurrent-2.1.jar
commons-logging-1.1.jar
geronimo-connector-1.2-beta.jar
geronimo-j2ee-connector_1.5_spec-1.0.1.jar
geronimo-j2ee-management_1.0_spec-1.0.jar
geronimo-jms_1.1_spec-1.0.jar
geronimo-jta_1.0.1B_spec-1.0.1.jar
geronimo-transaction-1.2-beta.jar
jencks-2.0-all.jar
jencks-amqpool-2.0.jar
log4j-1.2.12.jar
mx4j-2.1.1.jar
spring-2.0.jar
分享到:
评论

相关推荐

    家庭的社会学习理论:分析

    Jencks,1972;Jensen,1973;Moos &amp; Insel,1974;Schulman,1970;Walberg,1971 )。 环境研究综述(例如,Bloom, 1964; Dave, 1963; Marjoribanks, 1972a; Mosychuk, 1969; Plowden, 1967; Vernon

    正常和学习障碍青少年的配对表现

    该实验的结果还表明,一些调查可能过于悲观(Jencks,1972),并且当黑人儿童获得非常早期的学前教育时,有希望的教育结果是可行的,前提是这些计划包括父母和社区资源参与和参与以及教育程序通过在丰富课程完成后与...

    android手机应用源码Imsdroid语音视频通话源码.rar

    android手机应用源码Imsdroid语音视频通话源码.rar

    营销计划汇报PPT,市场品牌 推广渠道 产品 营销策略tbb.pptx

    营销计划汇报PPT,市场品牌 推广渠道 产品 营销策略tbb.pptx

    JavaScript_超过100种语言的纯Javascript OCR.zip

    JavaScript

    JavaScript_跨平台React UI包.zip

    JavaScript

    node-v16.17.0-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    520表白代码.rar

    520表白html5爱心代码

    一个简单的HTML5和CSS代码示例,用于创建一个动态的爱心形状,并在网页上展示一个类似520表白的消息 这个示例使用了CSS的

    520表白html5爱心代码 一个简单的HTML5和CSS代码示例,用于创建一个动态的爱心形状,并在网页上展示一个类似520表白的消息。这个示例使用了CSS的动画效果和HTML的结构。

    智慧养老社区方案.pdf

    智慧养老社区方案.pdf

    node-v14.11.0-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    JavaScript_美观和可访问的拖放列表与React.zip

    JavaScript

    codeviz 1.0.12

    codeviz 1.0.12

    JavaScript_高级用户LLM前端.zip

    JavaScript

    javascript koans是一个交互式学习环境,它使用失败测试按逻辑顺序向学生介绍javascript的各个方面.zip

    JavaScript

    JavaScript_巴勒斯坦和巴以冲突资源的策划列表.zip

    JavaScript

    JavaScript_手工制作的弗里达例子.zip

    JavaScript

    node-v17.4.0-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    移动应用Android 实现QQ好友列表源码.rar

    移动应用Android 实现QQ好友列表源码.rar

    DC平台蛋白质分子匹配预测.zip

    蛋白质是生物体中普遍存在的一类重要生物大分子,由天然氨基酸通过肽键连接而成。它具有复杂的分子结构和特定的生物功能,是表达生物遗传性状的一类主要物质。 蛋白质的结构可分为四级:一级结构是组成蛋白质多肽链的线性氨基酸序列;二级结构是依靠不同氨基酸之间的C=O和N-H基团间的氢键形成的稳定结构,主要为α螺旋和β折叠;三级结构是通过多个二级结构元素在三维空间的排列所形成的一个蛋白质分子的三维结构;四级结构用于描述由不同多肽链(亚基)间相互作用形成具有功能的蛋白质复合物分子。 蛋白质在生物体内具有多种功能,包括提供能量、维持电解质平衡、信息交流、构成人的身体以及免疫等。例如,蛋白质分解可以为人体提供能量,每克蛋白质能产生4千卡的热能;血液里的蛋白质能帮助维持体内的酸碱平衡和血液的渗透压;蛋白质是组成人体器官组织的重要物质,可以修复受损的器官功能,以及维持细胞的生长和更新;蛋白质也是构成多种生理活性的物质,如免疫球蛋白,具有维持机体正常免疫功能的作用。 蛋白质的合成是指生物按照从脱氧核糖核酸(DNA)转录得到的信使核糖核酸(mRNA)上的遗传信息合成蛋白质的过程。这个过程包括氨基酸的活化、多肽链合成的起始、肽链的延长、肽链的终止和释放以及蛋白质合成后的加工修饰等步骤。 蛋白质降解是指食物中的蛋白质经过蛋白质降解酶的作用降解为多肽和氨基酸然后被人体吸收的过程。这个过程在细胞的生理活动中发挥着极其重要的作用,例如将蛋白质降解后成为小分子的氨基酸,并被循环利用;处理错误折叠的蛋白质以及多余组分,使之降解,以防机体产生错误应答。 总的来说,蛋白质是生物体内不可或缺的一类重要物质,对于维持生物体的正常生理功能具有至关重要的作用。

Global site tag (gtag.js) - Google Analytics