MyException - 我的异常网
当前位置:我的异常网» 开源软件 » 利用Spring中的JmsTemplate回进行ActiveMQ的整合

利用Spring中的JmsTemplate回进行ActiveMQ的整合

www.MyException.Cn  网友分享于:2013-02-20  浏览:355次
利用Spring中的JmsTemplate来进行ActiveMQ的整合

JmsTemplate就是Spring用来解决JMS冗长重复代码的方案,它可以创建连接,获取会话,发送和接收消息,使用它之后,使得你可以专注于构建要发送的消息及处理收到的消息。

 

我这里单独写了一个activemq的配置文件,在spring的配置文件中引入。我在用spring3.1加上active5.7的时候,如下的配置会报java.lang.reflect.MalformedParameterizedTypeException,这貌似是一个bug。后来我降为active5.4就没问题了

 

	<bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">    
       <property name="brokerURL" value="tcp://192.168.2.6:61616" />  
       <property name="useAsyncSend" value="true"></property>
   </bean>

  <!-- 配置connectionFactory -->
	<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
		destroy-method="stop">
		<property name="connectionFactory" ref="connectionFactory"></property>
		<property name="maxConnections" value="8"></property>
	</bean>
  
 <!-- 发送消息的目的地(一个队列) -->  
    <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">  
        <!-- Set the Queue Name -->  
        <constructor-arg index="0" value="goodsQueue?consumer.prefetchSize=1"/>
    </bean>  
    
    <!-- 配置JMS模版 -->  
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
        <property name="connectionFactory"  ref="jmsFactory"/>  
        <property name="defaultDestination" ref="destination"/>  
        <property name="deliveryPersistent" value="false" />  
    </bean> 
    
    <bean id="myMessageProducer" class="com.naomi.spider.common.MyMessageProducer" >
      	<property name="jmsTemplate" ref="jmsTemplate" />
      	<property name="destination" ref="destination" />
    </bean>
  
    <!-- 异步接受 -->
    <bean id="myMessageConsumer" class="com.naomi.spider.common.MyMessageConsumer" />
    <bean id="jmsContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="jmsFactory" />
        <property name="destination" ref="destination" />
        <property name="messageListener" ref="myMessageConsumer" />
        <property name="sessionTransacted" value="false"/>
    </bean>

   发送消息

 

   

template.send((javax.jms.Destination) destination, new MessageCreator(){  
                public Message createMessage(Session session) throws JMSException {  
                    return session.createTextMessage("hello");  
                }  

接受消息

 

jmsTemplate接收消息十分的简单,只需要调用template.receive()方法,receive方法是同步的,默认情况下,对receive()方法的调用会造成阻塞,知道消息到达目标----如果必要,永远等下去。为了避免对消息内容等待,可以配置jmsTemplate时,通过设置receiveTimeout属性来指定接收消息超时间。template.receive()会从默认目标接收消息,如果你希望指定一个目标,可以传一个目标。如:template.receive("myQueue").

同步接收消息并不是spring唯一的选择,消息监听器可以实现异步。activemq提供了messageListener接口,来为我们实现异步的接收消息。这样我们就不需要再手动的调用receive方法获取信息,当有消息发送到队列中时,就会自动的接受消息。我采用的是多线程异步的方式,效率要比同步的好一些。

 

 

自动将消息转化为Java对象

Spring通过MessageConverter接口提供了对消息转换的支持。此时,发送和接收消息要换成template.convertAndSend(message);template.receiveAndConvert();

可是jmsTemplate如何知道消息转换器呢?需要在配置jmsTemplate的时候,加上messageConverter属性。

<property name="messageConverter" ref="messageObj"></property> 

 

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有