activemq消息转换器MessageConverter

来源:互联网 发布:versions 1.7 for mac 编辑:程序博客网 时间:2024/06/06 05:41

==MessageConverter的作用主要有两方面,一方面它可以把我们的非标准化Message对象转换成我们的目标Message对象,这主要是用在发送消息的时候;另一方面它又可以把我们的Message对象转换成对应的目标对象,这主要是用在接收消息的时候。==

<!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->  <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">      <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->      <property name="connectionFactory" ref="connectionFactory"/>  </bean>  

在以上spring整合activemq的时候,我们发送消息是这样的

jmsTemplate.send(destination, new MessageCreator() {    public Message createMessage(Session session) throws JMSException {        ObjectMessage objMessage = session.createObjectMessage(obj);        return objMessage;    }

每次发送都需要定义一个内部类来申明这个message的类型,很麻烦

我们定义一个类型转换器,就能知道发送的数据的类型是ObjectMessage还是TextMessage

public class AMessageConverter implements MessageConverter {    public Message toMessage(Object object, Session session)            throws JMSException, MessageConversionException {        return session.createObjectMessage((Serializable) object);    }    public Object fromMessage(Message message) throws JMSException, MessageConversionException {        ObjectMessage objMessage = (ObjectMessage) message;        return objMessage.getObject();    }}

重新整合jms

<!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->  <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">      <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->      <property name="connectionFactory" ref="connectionFactory"/>    <property name="messageConverter" ref="aMessageConverter"/></bean> <!-- 类型转换器 --><bean id="aMessageConverter" class="com.xxx.activemq.AMessageConverter"/>

这样我们调用jmsTemplate发送消息就会变得很简单

jmsTemplate.convertAndSend(destination, obj);//他会将obj类型转化成一个序列化的ObjectMessage类型进行发送

当然这个转换器除了能将java类转化成指定的Message.还能在类中手工调用,将监听接收到的消息转化成我们指定的对象

<!-- 消息监听器 -->    <bean id="consumerMessageListener" class="com.xxx.activemq.ConsumerMessageListener">        <property name="messageConverter" ref="aMessageConverter"/>    </bean>
    private MessageConverter MessageConverter;      public void onMessage(Message message) {          if (message instanceof ObjectMessage) {              ObjectMessage objMessage = (ObjectMessage) message;              try {                 AMMessage msg = messageConverter.fromMessage(objMessage);//Ammessage是我们自己定义某种规范用来传输的类            } catch (JMSException e) {                  e.printStackTrace();              }          }      }  
0 0
原创粉丝点击