轻量级Spring 之 JmsTemplate 接收消息和发送消息

                         Spring是一个完整的J2EE框架和解决方案,完整并且模块化,你可以用的他的全部也可以只用他的一部分特性,Spring 包含 IoC, AOP, 事务处理,ORM, 也包括一个简单的MVC框架.
           用Spring,自我感觉,可以使你的代码至少节约30%,它的很多template很不错的,比如简单封装后的jdbctemplate,jmstemplate等。ioc用后就会爱不释手,它让你的代码风格完全改观。以前我要产生个对象,绝大多数时候只回想到new一个对象,而用spring的ioc,beanfactory,只需要配置一个xml文件即可。这种方式实现了松偶合,对单元测试非常有利。
还有它的aop,也是很不错的,
用spring的感觉,正如它的名字一样:如沐春风.
关于spring中的jms,spring把jms进行了简单的封装,用它的JmsTemplate可以很方便的发送和接收消息,并且资源的管理都由template来管理了.

          1:在web.xml文件中配置一个spring用的上下文:

<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/jmsconfig.xml </param-value> </context-param>                    jmsconfig.xml用来装配jms,内容如下:


<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>jms/Ntelagent/RequestQCF</value> </property> </bean> <bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>jms/Ntelagent/RequestQ</value> </property> </bean> <bean id="jmsConnectionFactoryForReceive" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>jms/Ntelagent/ResponseQCF</value> </property> </bean> <bean id="destinationForReceive" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>jms/Ntelagent/ResponseQ</value> </property> </bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate102"> <property name="connectionFactory"> <ref bean="jmsConnectionFactory" /> </property> <property name="defaultDestination"> <ref bean="destination" /> </property> <property name="messageConverter"> <ref bean="jmsTrxConverter" /> </property> <property name="receiveTimeout"> <value>1</value> </property> </bean> <bean id="jmsTemplateForReceive" class="org.springframework.jms.core.JmsTemplate102"> <property name="connectionFactory"> <ref bean="jmsConnectionFactoryForReceive" /> </property> <property name="defaultDestination"> <ref bean="destinationForReceive" /> </property> <property name="messageConverter"> <ref bean="jmsTrxConverter" /> </property> <property name="receiveTimeout"> <value>1</value> </property> </bean> <bean id="jmsTrxConverter" class="co.transport.jms.JmsTransactionConverter"> <property name="rspQueue"> <ref bean="destinationForReceive" /> </property> </bean> <bean id="jmsRequestTransport" class="co.transport.jms.JmsRequestTransport"> <property name="jmsTemplate"> <ref bean="jmsTemplate" /> </property> <property name="jmsTemplateForReceive"> <ref bean="jmsTemplateForReceive" /> </property> </bean> </beans>

     其中:

           jmsConnectionFactory为jms连接工厂,属性jndiName的value为server服务配置的jndi名称.

         destination为消息队列,属性jndiName为消息队列的jndi名称.

         jmsTemplate为配置spring消息模版:采用JmsTemplate102(如果你的JMS实现符合JMS规范1.1版,则应该使用JmsTemplate),其中的messageConverter属性配置了一个消息转换器,因为通常消息在发送前和接收后都需要进行一个前置和后置处理,转换器便进行这个工作。
由于我的sendQueue很receiveRueue是不同的queue,所以我配置了两个jmsTemplate:jmsTemplateForReceive负责接收消息,jmsTemplate负责发发送消息.

    发送消息的代码很简单:

            jmsTemplate.convertAndSend(request);

接收消息也很简单:

                Object obj = jmsTemplate.receiveAndConvert();
如果需要用一个过滤器接收特定的消息,则:

                 Object obj = this.jmsTemplateForReceive.receiveSelectedAndConvert(this.messageSelector);

发送和接收消息的class如下

public class JmsRequestTransport implements RequestTransport { private JmsTemplate jmsTemplate; private JmsTemplate jmsTemplateForReceive; private String messageSelector; private String destinationName; public void setJmsTemplate(JmsTemplate template) { this.jmsTemplate = template; } public void request(Object request) { jmsTemplate.convertAndSend(request); } public Object receive() { System.out.println("in JmsRequestTransport: destinationName = " + this.jmsTemplateForReceive.getDefaultDestinationName()); System.out.println("in JmsRequestTransport: messageSelector = " + messageSelector); Object obj = this.jmsTemplateForReceive .receiveSelectedAndConvert(this.messageSelector); return obj; } public String getMessageSelector() { return messageSelector; } public void setMessageSelector(String string) { messageSelector = string; } public String getDestinationName() { return destinationName; } public void setDestinationName(String string) { destinationName = string; } public JmsTemplate getJmsTemplateForReceive() { return jmsTemplateForReceive; } public void setJmsTemplateForReceive(JmsTemplate template) { jmsTemplateForReceive = template; } }
        要实现一个消息转换器,只需要实现MessageConverter接口,MessageConverter很简单,它只有两个方法需要实现:
              public Object fromMessage(Message msg){}
                  public Message toMessage(Object obj, Session session) throws JMSException{}
                     fromMessage为接收消息后,对消息进行的转换(通常是把一个message转化为一个Object对象)
                 toMessage为发送消息前需要的转化(通常为把一个Object转化为一个message对象)
                我的JmsTransactionConverte public class JmsTransactionConverter implements MessageConverter { private Queue rspQueue; public JmsTransactionConverter(){} public Object fromMessage(Message msg){ MessageBean msgBean = new MessageBean(); TextMessage massage = (TextMessage)msg; try { String str = massage.getText(); msgBean.setHead("HeadTest"); msgBean.setOutput(str); msgBean.setStatus("success"); } catch (JMSException e) { // TODO Auto-generated catch block msgBean = null; e.printStackTrace(); } finally { return msgBean; } }


转载于:https://www.cnblogs.com/J2EEPLUS/archive/2012/04/23/2488145.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
什么是消息 消息是一个用于在组件和应用程序之间通讯的的方法。消息之间的传递是点对点的。任何终端之间都可以相互接受和发送消息。并且每个终端都必须遵守如下的规则 -> 创建消息 -> 发送消息 -> 接收消息 -> 读取消息 为什么要使用消息 理由很简单,消息是一个分布式的低耦合通讯方案。A发送一个消息到一个agent ,B作为接受者去agent上获取消息。但是A,B不需要同时到agent上去注册。agent作为一个中转为A,B提供搞效率的通讯服务。 Java消息服务支持两种消息模型:Point-to-Point消息(P2P)和发布订阅消息(Publish Subscribe messaging,简称Pub/Sub)。JMS规范并不要求供应商同时支持这两种消息模型,但开发者应该熟悉这两种消息模型的优势与缺点。 企业消息产品(或者有时称为面向消息的中间件产品)正逐渐成为公司内操作集成的关 键组件。这些产品可以将分离的业务组件组合成一个可靠灵活的系统。 除了传统的 MOM 供应商,企业消息产品也可以由数据库供应商和许多与网络相关的公 司来提供。 Java 语言的客户端和 Java 语言的中间层服务必须能够使用这些消息系统。JMSJava 语言程序提供了一个通用的方式来获取这些系统。 JMS 是一个接口和相关语义的集合,那些语义定义了 JMS 客户端如何获取企业消息产品 的功能。 由于消息是点对点的,所以 JMS 的所有用户都称为客户端(clients)。JMS 应用由定义 消息的应用和一系列与他们交互的客户端组成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值