- 浏览: 957147 次
- 性别:
- 来自: 江西上饶
文章分类
- 全部博客 (460)
- p.spring (56)
- p.maven (20)
- p.ant (17)
- p.jee (18)
- p.jse (33)
- p.ofbiz (31)
- p.软件工程 (8)
- p.struts2 (5)
- p.hibernate (5)
- linux (25)
- 设计模式 (2)
- p.javascript (11)
- 硬件 (1)
- p.jsp (2)
- p.windows批处理 (1)
- 操作系统问题 (5)
- 算法 (1)
- p.mysql (7)
- p.sql (5)
- p.c (1)
- google产品 (0)
- 内存 (1)
- p.struts (1)
- p.freemarker (7)
- p.css (4)
- p.log4j (10)
- p.html (3)
- 淘宝产品 (0)
- 其他 (3)
- 编译器 (0)
- svn (4)
- p.spring.security (11)
- 图形 (0)
- p.xml (1)
- p.ssh (0)
- p.jquery (4)
- p.jdbc (3)
- p.flex (0)
- p.c++ (0)
- p.c#Net (0)
- p.assembly (0)
- p.sqlserver (0)
- p.其他 (3)
- p.webwork (21)
- p.wap (12)
- p.cglib (1)
- p.jee服务器 (11)
- windows (2)
- p.iphone (1)
- p.java.分布式与集群 (2)
- p.ibatis (16)
- p.eclipse (5)
- 架构 (2)
- http协议 (5)
- 我的个人标准 (2)
- 多线程 (1)
- 奇怪问题 (5)
- p.jira (13)
- p.httpclient (1)
- 服务器.apache (11)
- 安全防范 (1)
- p.PODAM (1)
- p.junit (16)
- fop (2)
- 硬盘安装 (1)
- powerdesigner (0)
- 单元测试 (1)
- apache commons (4)
- tomcat+apache集群 (10)
- 各类诡辩 (1)
- 安卓 (8)
- qvod (1)
- java编程基础知识考试考点及答案 (0)
- 工作总结 (4)
- oracle (0)
- spring的util工具 (3)
- json (2)
- maven (3)
- jms (19)
- p.bat (3)
- hadoop (2)
- git (3)
- nginx (1)
- p.移动开发 (1)
- shiro (3)
- 游戏破解 (1)
- react-native (7)
- ios开发 (1)
- webmagic (6)
- socks5 (1)
最新评论
-
weituotian:
说的不好,没人看的
公司系统中的菜单功能和权限功能 -
石不易:
非常详细的注解~
绑定端口和IP,Listen 与VirtualHost指令 -
spring_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
spring mvc -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装 -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装
同步接收和同步发送的情况(使用JNDI)
异步接收消息
JmsTemplete是用来发送和接收消息的(同步),另外有一个JmsTemplete102类,是支持更老的版本JMS1.02
它可以自动将对象转换成需要的JMS的Message类型。
常用方法
send 参数MessageCreator是用来创建消息的
convertAndSend 会自动调用spring的SimpleMessageConverter类进行消息转化。通过参数MessagePostProcessor,可以用来设置属性,头。
receive 接收消息
receiveSelected 根据选择器接收
receiveAndConvert 接收,并转化成对应的java对象。SimpleMessageConverter使用该转化器,通过jmsTemplate的messageConverter属性可以指定转化器实现。
JNDI方式
消息驱动模式
实现MessageListener接口
实现SessionAwareMessageListener 接口
MessageListenerAdapter
SessionAwareMessageListener 和MessageListener的接口很像,但是支持访问session
MessageListenerAdapter模式,可以对任何POJO对象使用监听器模式,而不用实现MessageLister接口,在收到消息后,该模式会自动在POJO中查找如下方法
public void handleMessage(String message) {...}
//receive a converted BytesMessage
public void handleMessage(byte[ ] message) {...}
//receive a converted MapMessage
public void handleMessage(Map message) {...}
//receive a converted ObjectMessage
public void handleMessage(Object message) {...}
这种情况下,MessageListenerAdapter已经对Message进行过转化,只能访问消息内容,而要访问消息本身,需要
并且MessageListenerAdapter在查找处理方法查找的就是
//receive a JMS TextMessage
public void handleMessage(TextMessage message) {...}
//receive a JMS BytesMessage
public void handleMessage(BytesMessage message) {...}
//receive a JMS MapMessage
public void handleMessage(MapMessage message) {...}
//receive a JMS ObjectMessage
public void handleMessage(ObjectMessage message) {...}
//receive a JMS StreamMessage
public void handleMessage(StreamMessage message) {...}
,假如POJO无法找到匹配的方法,就会造成NoSuchMethodException
如果不想使用handleMessage作为方法名,可以通过设置defaultListenerMethod属性
三种方式都有一个监听容器,类似于JmsTemplete,需要创建一个监听容器的上下文bean,容器有两个常用的
DefaultMessageListenerContainer 可以动态调整线程数,支持XA外部事物
SimpleMessageListenerContainer 不可以动态调整线程数
事物管理
Spring为JMS提供了本地事务管理的能力,JMS事务管理器和数据库事务管理器都是PlatformTransactionManager接口的实现类,Spring的org.springframework.jms.connection包提供了用于管理JMS本地事务JmsTransactionManager事务管理器
对于那些未基于JmsTemplate编写的JMS处理类,可以让消息监听器容器对它们进行事务管理。DefaultMessageListenerContainer和ServerSessionMessageListenerContainer都支持通过消息监听器使用JMS事务,不过必须为他们提供一个事务管理器,如下配置:
<!— 事务管理器 -->
命名空间
常用的命名空间元素是jms:listener和jms:listener-container
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-2.5.xsd">
命名空间前的监听器配置,假设有两个监听器
使用命名空间,对于监听器部分的配置,可以简化为
异步接收消息
JmsTemplete是用来发送和接收消息的(同步),另外有一个JmsTemplete102类,是支持更老的版本JMS1.02
它可以自动将对象转换成需要的JMS的Message类型。
public class SimpleJMSSender { public static void main(String[] args) { try { ApplicationContext ctx = new ClassPathXmlApplicationContext("app-context.xml"); JmsTemplate jmsTemplate = (JmsTemplate)ctx.getBean("jmsTemplate"); //发送消息 jmsTemplate.convertAndSend("This is easy!"); } } }
常用方法
send 参数MessageCreator是用来创建消息的
convertAndSend 会自动调用spring的SimpleMessageConverter类进行消息转化。通过参数MessagePostProcessor,可以用来设置属性,头。
receive 接收消息
receiveSelected 根据选择器接收
receiveAndConvert 接收,并转化成对应的java对象。SimpleMessageConverter使用该转化器,通过jmsTemplate的messageConverter属性可以指定转化器实现。
JNDI方式
<!--设置连接属性,通过jndiTemplate可以初始化jndi,已经通过temp获取factory,相当于执行 InitialContext initialContext = new InitialContext(); ConnectionFactory factory = (ConnectionFactory) initialContext .lookup(factoryName); --> <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"> <property name="environment"> <props> <!--ActiveMQInitialContextFactory生产出来的factory应该是同时实现了TopicConnectionFactory和QueueConnectionFactory两个接口的--> <prop key="java.naming.factory.initial"> org.apache.activemq.jndi.ActiveMQInitialContextFactory</prop> <prop key="java.naming.provider.url">tcp://localhost:61616</prop> <prop key="java.naming.security.principal">system</prop> <prop key="java.naming.security.credentials">manager</prop> </props> </property> </bean> <!----> <bean id="jndiQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiTemplate" ref="jndiTemplate"/> <property name="jndiName" value="QueueCF"/> </bean> <!--CachingConnectionFactory类扩展自SingleConnectionFactory,主要用于提供缓存JMS资源功能。具体包括MessageProducer、MessageConsumer和Session的缓存功能。 Spring中发送消息的核心是JmsTemplate,然而Jmstemplate的问题是在每次调用时都要打开/关闭session和producter,效率很低,刚开始的解决方案是PooledConnectionFactory连接池,用于缓存session和producter。然而这还不是最好的。从spring2.5.3版本后,Spring又提供了CachingConnectionFactory,这才是首选的方案。然而CachingConnectionFactory有一个问题必须指出,默认情况下,CachingConnectionFactory只缓存一个session,它声明对于低并发情况下这是足够的。与之相反,PooledConnectionFactory的默认值是500。这些设置,在很多情况下,需要亲自去测试并验证。CachingConnectionFactory的缓存大小,要根据实际情况设置 --> <bean id="queueConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <property name="targetConnectionFactory" ref="jndiQueueConnectionFactory"/> <property name="sessionCacheSize" value="1"/> </bean> <!--目的地解析器,可以简单的认为是对目的地的简单转化功能,如将string转化成queue--> <bean id="destinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver"> <property name="jndiTemplate" ref="jndiTemplate"/> <property name="cache" value="true"/> <property name="fallbackToDynamicDestination" value="false"/> </bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="queueConnectionFactory"/> <property name="destinationResolver" ref="destinationResolver"/> <property name="defaultDestinationName" value="queue1"/> <property name="pubSubDomain" value="false"/> </bean>
消息驱动模式
实现MessageListener接口
实现SessionAwareMessageListener 接口
MessageListenerAdapter
SessionAwareMessageListener 和MessageListener的接口很像,但是支持访问session
public interface SessionAwareMessageListener<M extends Message> { void onMessage(M message, Session session) throws JMSException; }
MessageListenerAdapter模式,可以对任何POJO对象使用监听器模式,而不用实现MessageLister接口,在收到消息后,该模式会自动在POJO中查找如下方法
public void handleMessage(String message) {...}
//receive a converted BytesMessage
public void handleMessage(byte[ ] message) {...}
//receive a converted MapMessage
public void handleMessage(Map message) {...}
//receive a converted ObjectMessage
public void handleMessage(Object message) {...}
这种情况下,MessageListenerAdapter已经对Message进行过转化,只能访问消息内容,而要访问消息本身,需要
<bean id="messageListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg> <bean class="SimpleJMSReceiver"/> </constructor-arg> <!--通过设置消息转化器为null,防止转化。 <property name="messageConverter"><null/></property> </bean>
并且MessageListenerAdapter在查找处理方法查找的就是
//receive a JMS TextMessage
public void handleMessage(TextMessage message) {...}
//receive a JMS BytesMessage
public void handleMessage(BytesMessage message) {...}
//receive a JMS MapMessage
public void handleMessage(MapMessage message) {...}
//receive a JMS ObjectMessage
public void handleMessage(ObjectMessage message) {...}
//receive a JMS StreamMessage
public void handleMessage(StreamMessage message) {...}
,假如POJO无法找到匹配的方法,就会造成NoSuchMethodException
<bean id="messageListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg> <!--这里可以是任何的JAVABEAN--> <bean class="SimpleJMSReceiver"/> </constructor-arg> </bean> <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="queueConnectionFactory"/> <property name="destinationResolver" ref="destinationResolver"/> <property name="concurrentConsumers" value="3" /> <property name="destinationName" value="queue1"/> <property name="messageListener" ref="messageListener" /> </bean>
如果不想使用handleMessage作为方法名,可以通过设置defaultListenerMethod属性
<bean id="messageListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg> <bean class="TradeOrderManager"/> </constructor-arg> <property name="defaultListenerMethod" value="createTradeOrder"/> </bean>
三种方式都有一个监听容器,类似于JmsTemplete,需要创建一个监听容器的上下文bean,容器有两个常用的
DefaultMessageListenerContainer 可以动态调整线程数,支持XA外部事物
SimpleMessageListenerContainer 不可以动态调整线程数
<!--一个MessageListener的实现--> <bean id="messageListener" class="SimpleJMSReceiver"/> <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="queueConnectionFactory"/> <property name="destinationResolver" ref="destinationResolver"/> <property name="concurrentConsumers" value="3" /> <property name="destinationName" value="queue1"/> <property name="messageListener" ref="messageListener" /> </bean>
事物管理
Spring为JMS提供了本地事务管理的能力,JMS事务管理器和数据库事务管理器都是PlatformTransactionManager接口的实现类,Spring的org.springframework.jms.connection包提供了用于管理JMS本地事务JmsTransactionManager事务管理器
<bean id="transactionManager" class="org.springframework.jms.connection.JmsTransactionManager"> <property name=”connectionFactory" ref="internalJmsQueueConnectionFactory"/> </bean>
对于那些未基于JmsTemplate编写的JMS处理类,可以让消息监听器容器对它们进行事务管理。DefaultMessageListenerContainer和ServerSessionMessageListenerContainer都支持通过消息监听器使用JMS事务,不过必须为他们提供一个事务管理器,如下配置:
<!— 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jms.connection.JmsTransactionManager"> <property name="connectionFactory" ref=" internalJmsQueueConnectionFactory"/> </bean>
<!—消息监听器容器 --> <bean id="listenerContainer" class="org.springframeword.jms.listener.DefaultMessageListenerContainer"> <property name="transactionManager" ref="transactionManager"/> </bean>
命名空间
常用的命名空间元素是jms:listener和jms:listener-container
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-2.5.xsd">
命名空间前的监听器配置,假设有两个监听器
<bean id="messageListener1" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg> <bean class="SimpleJMSReceiver1"/> </constructor-arg> <property name="defaultListenerMethod" value="processRequest"/> </bean> <bean id="messageListener2" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg> <bean class="SimpleJMSReceiver2"/> </constructor-arg> <property name="defaultListenerMethod" value="processRequest"/> </bean> <bean id="jmsContainer1" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="queueConnectionFactory"/>
使用命名空间,对于监听器部分的配置,可以简化为
<bean id="messageListener1" class="SimpleJMSReceiver1"/> <bean id="messageListener2" class="SimpleJMSReceiver2"/> <jms:listener-container connection-factory="queueConnectionFactory" destination-resolver="destinationResolver" concurrency="3"> <jms:listener destination="queue1" ref="messageListener1" /> <jms:listener destination="queue2" ref="messageListener2" /> </jms:listener-container> ...
发表评论
-
activemq in action 翻译
2014-11-20 10:45 851http://jackyin5918.iteye.com/ca ... -
高并发
2014-11-16 21:58 1591垂直扩展 垂直扩展是一种用于增加单个ActiveMQ代理连接数 ... -
删除不活动的队列(Delete Inactive Destinations)
2014-11-16 16:41 1350一般情况下,ActiveMQ的queue在不使用之后,可以通过 ... -
代理网络中消息传递
2014-11-13 21:21 789常见的方式是让所有客户端都连接到一个中心代理,而这不是使用消息 ... -
企业部署
2014-11-13 14:26 684主从备份方式 多个代理 ... -
REST和AJAX
2014-11-12 17:01 789REST 通过activemq提供的servlet < ... -
安全机制
2014-10-15 15:22 1246ActiveMQ中所有安全相关的概念都是通过插件的形式实现的. ... -
与spring结合
2014-10-15 14:06 790在Spring中嵌入ActiveMQ有四种方式:纯Spring ... -
activemq 消息存储
2014-10-13 17:03 2339JMS规范支持两种方式分发消息:持久化和非持久化。Active ... -
ActiveMQ配置 连接activemq
2014-10-08 10:13 39056activemq代理 JMS代理(如ActiveMQ bro ... -
ActiveMQ简介
2014-10-08 09:49 772支持跨平台跨语言等特点,由于它是用JAVA实现的一套中间件,跨 ... -
jms-事物
2014-09-29 16:52 679JMSRedelivered可以检查消 ... -
过滤器与消息选择器
2014-09-28 23:08 703过滤器 String filter = &quo ... -
发布订阅模式
2014-09-28 11:52 1023特点 1.通过话题通道进行交互。 2.可以有多个订阅者,订阅者 ... -
jms-点对点
2014-09-27 23:45 983在点对点模式中,消息创建者称为发送者,消息消费者称为接收者。 ... -
jms-message对象
2014-09-26 14:40 1201message必须通过session创建,以便完成对应的初始化 ... -
jms基础,与例子
2014-09-24 22:14 1011MOM,面向消息中间件的交互模式 各个系统间,可以认为 ... -
jms的两种模式
2014-09-23 22:49 2271JMS有两种通信方式 P2P,点对点 方式和 发布/订阅模式P ...
相关推荐
在Spring中,JMS的集成主要依赖于`spring-jms`模块,该模块提供了对各种JMS供应商的抽象和支持,例如ActiveMQ,RabbitMQ,IBM WebSphere MQ等。ActiveMQ是Apache软件基金会的一个开源项目,是一个功能丰富的JMS提供...
该库包含: 用于应用程序的mq-jms-spring-boot-starter安装及使用该软件包的编译版本可以从Maven Central自动下载。 有关本地修改和自行构建的信息,请参见Spring Boot应用程序Gradle: repositories { mavenLocal...
spring-jms-4.0.0.RELEASE.jar spring-jms-4.0.0.RELEASE.jar spring-jms-4.0.0.RELEASE.jar spring-jms-4.0.0.RELEASE.jar
spring-jms-3.1.1.RELEASE.jar
赠送jar包:spring-jms-4.3.20.RELEASE.jar; 赠送原API文档:spring-jms-4.3.20.RELEASE-javadoc.jar; 赠送源代码:spring-jms-4.3.20.RELEASE-sources.jar; 包含翻译后的API文档:spring-jms-4.3.20.RELEASE-...
赠送jar包:spring-jms-4.3.12.RELEASE.jar; 赠送原API文档:spring-jms-4.3.12.RELEASE-javadoc.jar; 赠送源代码:spring-jms-4.3.12.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-jms-4.3.12.RELEASE....
赠送jar包:spring-jms-4.3.20.RELEASE.jar 赠送原API文档:spring-jms-4.3.20.RELEASE-javadoc.jar 赠送源代码:spring-jms-4.3.20.RELEASE-sources.jar 包含翻译后的API文档:spring-jms-4.3.20.RELEASE-...
针对jms开发的架包 xbean-spring-3.9.jar
Spring框架提供了对JMS的全面支持,使得开发者可以方便地集成和管理消息传递系统。在本文中,我们将探讨如何在Spring中使用JMS进行异步传输,以及与ActiveMQ的结合实例。 首先,我们需要配置Spring的JMS支持。在...
spring-jms-5.0.4.RELEASE.jar ;spring-jms-5.0.4.RELEASE.jar
赠送jar包:spring-jms-4.3.12.RELEASE.jar; 赠送原API文档:spring-jms-4.3.12.RELEASE-javadoc.jar; 赠送源代码:spring-jms-4.3.12.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-jms-4.3.12.RELEASE....
《Spring JMS 4.3.4.RELEASE:开源项目的深度解析》 Spring Framework作为Java领域...对于想深入理解Spring JMS的开发者,可以从源码spring-framework-master入手,通过阅读和实践,进一步掌握其工作原理和使用技巧。
本项目"jms-spring3-ibmmq"是关于如何在Spring 3.2.x框架下集成JMS 1.0.2版本和IBM MQ的一个实例教程。 1. **JMS 1.0.2 知识点**: - JMS 是Java平台用于企业级应用间消息传递的API,支持点对点(Point-to-Point,...
spring-jms-4.1.4,Spring提供的JMS工具类,它发送、接收消息
JMS-SPRING:使用带有配置转换器类型的spring jms
spring-jmsspring-jmsspring-jmsspring-jmsspring-jmsspring-jms
spring-jms-4.1.0.RELEASE.ja
spring-jms-3.2.4.RELEASE.jar
spring-jms-4.0.xsd........................................
在Spring框架中,还可以利用Spring JMS模块简化JMS的使用。 总结,`javax.jms-1.1.jar`是Java消息服务API的实现,它提供了在分布式系统中进行可靠、异步通信的能力,通过标准化接口和消息模型,使得开发者可以轻松...