Spring 对 JMS的支持

来源:互联网 发布:淘宝新品流量扶持多久 编辑:程序博客网 时间:2024/05/18 16:40

 

SpringJMS的支持

Srpingorg.springframework.jsm包中提供了一个用于简化JMS API的使用的抽象框架,并对用户屏蔽了JMS1.1JMS1.02之间的差别

 

Spring JMS API

org.springframework.jms.core   JMS模板类 执行公共操作 使用接口回调  发送接收消息

org.springframework.jms  JMS提供的运行期异常体系

org.springframework.jms.support 提供异常转化器,JMS检查异常映射到该异常体系

org.springframework.jsm.support.conver  消息转化器,以便将POJO转化为JMS消息,提供MDP的功能

org.springframework.jms.listener  消息监听器容器,提供了异步消息接收的支持

org.springframework.jsm.support.destination  提供地址解析的功能,允许用户使用字符串的形式指定消息发送或接收地址,地址解析器负责地址的解析

org.springframework.jms.connection  提供一个ConnectionFactory的实现,还为JMS提供了一个SpringPlatformTransactionManager 的实现,JmsTaransactionManager ,这样JMS作为一个事务资源无缝集成到Spring的事务管理机制中

 

JMS模板类

         JMSTemplate   的使用情况对于两种消息域类型是一致的

JMSTemplate102

                                     JMSTemplate102通过指定pubSubDomain 属性指定消息类型true  Pub/Sub

         <bean id=”jsmTempalte” class=”org.springframewrok.jms.core.JmsTempalte”>

                   <property name=”pubSubDomain”value=”true”/>

         </bean>

        

         JmsTemplate102ConnectionFactory类型必须JMSTemplate的消息类型一致

         如果JmsTempalte的消息类型为 pubSubDomain=true,ConnectionFactory必须是

javax.jms.TopicConnectionFactory,如果是false,就使用javax.jms.QueueConnectionFactory

         因为PooledConnectionFactory只实现的ConnectionFactory接口,所以最好的办法是使用

         ActiveMQConnectionFactory,因为它同时实现了ConnectionFactory,TopicConnectionFactory,

QueueConnectionFactory 接口,或者使用JNDI中的ConnectionFactory ,开发中尽量使用后者

        

JmsTemplate 的支持类   org.springframework.jms.core.JmsGatewaySupport,只要向该类注入一个

         ConnectionFactory ,它会自动创建JmsTempalte 实例

        

JMS的异常映射

         JMS检查型异常转为运行时异常

         Org.srpingframework.jms包中的异常为javax.jms异常提供了类型转转换的镜像实现,Spring中的JMS异常都继承于JmsException

         除此之外,Spring还提供了一些特定的JMS异常

         DestinationResolutionException  DestinationResolver解析消息地址是发生错误抛出的异常

         SynchedLocalTransactionFailedExcetion 在同步本地事务发生异常抛出的异常,事务结束再次同步就会有这样的异常抛出

         UncategorizedJmsException 所有归类的异常

         JMS声明事务时可以在事务控制策略中使用这些异常

 

使用回调接口发送/接收消息

MessageSender.java

packagecn.com.snt.spring_jms;

importjavax.jms.JMSException;

import javax.jms.Message;

import javax.jms.Session;

 

importorg.springframework.jms.core.MessageCreator;

importorg.springframework.jms.core.support.JmsGatewaySupport;

 

public class MessageSenderextends JmsGatewaySupport {

         public voidsendTextMsg(final String textMsg){

                   getJmsTemplate().send(newMessageCreator(){

                            public MessagecreateMessage(Session session) throws JMSException {

                                     returnsession.createTextMessage(textMsg);

                            }

                   });

         }

}

applicationContext-sender.xml

<?xml version="1.0" ?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:amq="http://activemq.org/config/1.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

  http://activemq.org/config/1.0http://people.apache.org/repository/org.apache.activemq/xsds/activemq-core-4.1-incubator-SNAPSHOT.xsd">

  <bean id="connectionFactory"class="org.apache.activemq.pool.PooledConnectionFactory">

    <property name="connectionFactory">

        <bean class="org.apache.activemq.ActiveMQConnectionFactory">

            <property name="brokerURL" value="tcp://localhost:61616"/>

        </bean>

    </property>

  </bean>

 

  <bean id="dest" class="org.apache.activemq.command.ActiveMQQueue">

    <constructor-arg value="myDest"/>

  </bean>

  <bean id="jmsTemplate"class="org.springframework.jms.core.JmsTemplate">

    <property name="connectionFactory" ref="connectionFactory"/>

    <property name="defaultDestination" ref="dest"/>

  </bean>

 

  <bean id="messageSender"class="cn.com.snt.spring_jms.MessageSender">

    <property name="jmsTemplate" ref="jmsTemplate"/>

  </bean>

</beans>

MessageReceiver.java

packagecn.com.snt.spring_jms;

importjavax.jms.JMSException;

importjavax.jms.TextMessage;

importorg.springframework.jms.core.support.JmsGatewaySupport;

public classMessageReceiver extends JmsGatewaySupport {

         public voidreceiveTextMsg(){

                   TextMessagetextMsg=(TextMessage)getJmsTemplate().receive();

                   try{

                            System.out.println("msgid:"+textMsg.getJMSMessageID());

                            System.out.println("msg:"+textMsg.getText());

                   }catch(JMSExceptione){

                            e.printStackTrace();

                   }

         }

}

applicationContext-receiver.xml

<?xml version="1.0" ?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:amq="http://activemq.org/config/1.0"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

  http://activemq.org/config/1.0http://people.apache.org/repository/org.apache.activemq/xsds/activemq-core-4.1-incubator-SNAPSHOT.xsd">

    <bean id="connectionFactory"

        class="org.apache.activemq.pool.PooledConnectionFactory">

        <property name="connectionFactory">

            <bean

                class="org.apache.activemq.ActiveMQConnectionFactory">

                <property name="brokerURL"

                    value="tcp://localhost:61616"/>

            </bean>

        </property>

    </bean>

 

    <bean id="dest" class="org.apache.activemq.command.ActiveMQQueue">

        <constructor-arg value="myDest" />

    </bean>

 

    <bean id="jmsTemplate"

        class="org.springframework.jms.core.JmsTemplate">

        <property name="connectionFactory" ref="connectionFactory" />

        <property name="defaultDestination" ref="dest" />

    </bean>

   

    <bean id="messageReceiver" class="cn.com.snt.spring_jms.MessageReceiver">

        <property name="jmsTemplate" ref="jmsTemplate"/>

    </bean>

</beans>                                                          

 

JmsTemplate send 方法有三种重载

         send(MessageCreator messageCreator)   使用该方法一定要通过defaultDestination

defaultDestinationName指定默认地址,否则会报异常

         send(Destination dest,MessageCreatormessageCreator) 发送消息到指定目的地址

         send(String destinationName,StringmessageSelector ) 将消息发送到 DestinationResolver 解析destinationName得到的真实地址,默认采用DynamicDestinationResolver 解析地址

 

DestinationResoler 接口只有一个方法

         DestinationresolveDestinationName(Session session,String destintaionName,booleanpubSubDomain)

         pubSubDomain=true 解析为 Topic ,否则解析为Queue

原创粉丝点击