Sping整合ActiveMQ(二.Spring 对JMS的支持 )
Spring提供了一个用于简化JMS API使用的抽象框架,用户利用Spring使用JMS可以不用关心connection factory,session等资源的管理.类似于对JDBC的抽象,Spring提供了一个JmsTemplate类,抽象了操作JMS都必须做的公共步骤,留下了callback方法给用户去实现,如提供消息的真正内容等.
本文主要讲解一下怎么使用Spring来发送消息,接受消息和异步接受消息(MessageListener).
一,发送消息:
1,通过JmsTemplate的
send方法和提供一个MessageCreator的实现的最简单应用:
JAVA类(用配置文件中配置的默认的queue):
- public class JMSsenderBean {
- private JmsTemplate jmsTemplate;
- public void simpleSend() {
- this.jmsTemplate.send(new MessageCreator() {
- public Message createMessage(Session session) throws JMSException {
- return session.createTextMessage("hello queue world");
- }
- });
- }
配置:(本例在weblogic上配置了JMS服务)
- <beans>
- <bean id="JMSsenderBean" class="com.test.spring.jms.JMSsenderBean">
- <property name="jmsTemplate">
- <ref local="jmsTemplate"></ref>
- </property>
- <property name="queue">
- <ref local="destination1"></ref>
- </property>
- </bean>
- <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName">
- <value>jms/jmsconf</value>
- </property>
- <property name="jndiTemplate">
- <ref local="jndiTemplate"></ref>
- </property>
- </bean>
- <bean id="destination1" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName">
- <value>jms/jmsq1</value>
- </property>
- <property name="jndiTemplate">
- <ref local="jndiTemplate"></ref>
- </property>
- </bean>
- <bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName">
- <value>jms/jmsq</value>
- </property>
- <property name="jndiTemplate">
- <ref local="jndiTemplate"></ref>
- </property>
- </bean>
- <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
- <property name="connectionFactory">
- <ref local="connectionFactory" />
- </property>
- <property name="defaultDestination">
- <ref local="destination" />
- </property>
- </bean>
- <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
- <property name="environment">
- <props>
- <prop key="java.naming.factory.initial">
- weblogic.jndi.WLInitialContextFactory
- </prop>
- <prop key="java.naming.provider.url">
- t3://localhost:7001
- </prop>
- <!--
- <prop key="java.naming.security.authentication"> weblogic </prop>
- <prop key="java.naming.security.credentials"> security </prop>
- -->
- </props>
- </property>
- </bean>
- </beans>
2,在发送的时候指定Queue:(配置同上)
- public void withQSend() {
- this.jmsTemplate.send(queue, new MessageCreator() {
- public Message createMessage(Session session) throws JMSException {
- return session.createTextMessage("hello queue world to jmsq1");
- }
- });
- }
3,通过JmsTemplate的
convertAndSend方法和提供一个MessageConverter的实现来将传入的对象转成message:
- public void convertAndSend(MsgObject object) {
- this.jmsTemplate.setMessageConverter(new MyMessageConverter());
- this.jmsTemplate.convertAndSend(object);
- }
- public class MyMessageConverter implements MessageConverter{
- public Object fromMessage(Message message) throws JMSException, MessageConversionException {
- TextMessage msg = (TextMessage)message;
- MsgObject obj = new MsgObject();
- obj.setName("from message");
- return obj;
- }
- public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
- MsgObject obj = (MsgObject)object;
- return session.createTextMessage("from Object MsgObject " + obj.getName() + " " + obj.getAge());
- }
- }
4,实现SessionCallback,利用
JmsTemplate的execute方法来对session进行操作,可以发送和接受消息.
- public void sessionCbkSend() {
- this.jmsTemplate.execute(new MySessionCallback(this.jmsTemplate));
- }
- public class MySessionCallback implements SessionCallback{
- private JmsTemplate jmsTemplate;
- public MySessionCallback(JmsTemplate jmsTemplate) {
- this.jmsTemplate = jmsTemplate;
- }
- public Object doInJms(Session session) throws JMSException {
- jmsTemplate.send(new MessageCreator() {
- public Message createMessage(Session session) throws JMSException {
- System.out.println("..............");
- return session.createTextMessage("message from session back");
- }
- });
- System.out.println("..............");
- return null;
- }
- }
二,接受消息
- public void receiveMsg() {
- TextMessage msg = (TextMessage)this.jmsTemplate.receive();
- try {
- System.out.println(msg.getText());
- } catch (JMSException e) {
- e.printStackTrace();
- }
- }
三,异步接受消息:实现MessageListener,配置listenerContainer,默认情况下,Spring容器启动后,Listener就会启动.
- public class ExampleListener implements MessageListener {
- public void onMessage(Message message) {
- if (message instanceof TextMessage) {
- try {
- System.out.println(((TextMessage) message).getText());
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- } catch (JMSException ex) {
- throw new RuntimeException(ex);
- }
- } else {
- throw new IllegalArgumentException("Message must be of type TextMessage");
- }
- }
- }
配置
- <bean id="messageListener" class="com.test.spring.jms.ExampleListener">
- </bean>
- <bean id="jmsContainer"
- class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <property name="connectionFactory" ref="connectionFactory" />
- <property name="destination" ref="destination" />
- <property name="messageListener" ref="messageListener" />
- </bean>
通过listenerContainer的stop和shutdown方法停止服务.
jmsContainer.stop();
jmsContainer.shutdown();
对listener的事务管理:
如果是本地事务,只需要设置listenerContainer的sessionTransacted就可以了.
- <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- ...
- <property name="sessionTransacted" value="true"/>
- </bean>
如果在onMessage中还有对其他资源,如数据库的操作,需要使用JTA来控制全局事务.
- <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
- <bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- ...
- <property name="transactionManager" ref="transactionManager" />
- </bean>
相关推荐
Sping整合ActiveMq案例,利用Maven的坐标技术整合Sping技术实现消息生产者发送消息通过消息中间件,然后消息消费者消费消息
jms 案例对于初学者很有用的偶,很简单很使用的例子
mybatis与spring整合全部jar包 总共26个架包资源,可以直接导入使用
Spring+hibernate整合源代码 结束Sping+hibernate 的使用方法 包括演示示例
Spring--3.Spring AOP-2
spring-jms-3.2.12.RELEASE.jar spring-orm-3.2.12.RELEASE.jar spring-oxm-3.2.12.RELEASE.jar spring-struts-3.2.12.RELEASE.jar spring-test-3.2.12.RELEASE.jar spring-tx-3.2.12.RELEASE.jar spring-web-3.2.12...
spring-webmvc-5.0.8.RELEASE.jar
使用Spring框架必须的两个jar包 spring.jar 和 commons-logging.jar
spring mvc + spring + hibernate 全注解整合开发视频教程 11
spring-framework-5.3.20
SpingAOP.rar SpingAOP.rar
spring4.x
本课件全面讲解了RMI的一般实现,特殊问题解决及与sping的组合应用. 1.分布式计算的起因及基本原理 2.RMI体系结构 3.RMI服务器实现及编码 4.RMI客户机实现及编码 5.使RMI穿过防火墙--定制rmiSocket 6.Spring中...
这个是jar包,关于spring的这个是jar包,关于spring的这个是jar包,关于spring的这个是jar包,关于spring的这个是jar包,关于spring的这个是jar包,关于spring的这个是jar包,关于spring的这个是jar包,关于spring的...
Flex4 spring整合实例,采用了spring-flex-1.0.3.RELEASE-with-dependencies包
mybatis文档及与sping整合文档
springframework 是sping 里面的一个开源框架,主要用户javaee的企业开发。Spring是什么呢?首先它是一个开源的项目,而且非常活跃;它是一个基于IOC和AOP的构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须...
Spring mvc + Spring + Spring jdbc 整合 demo
spring整合ibatis的详细配置步骤
sping mvc 整合 mybatis