在Spring 之前Spring的JMS的作用局限于产生消息这个功能(封装在 JmsTemplate 类中)当然是很好的 但是它没有描述完整的JMS堆栈比如像消息的 异步 产生和消耗JMS堆栈缺少的这一部分已经被添加Spring 现在提供对消息异步消耗的完整支持
让我们从一个例子开始
首先我们打开ActiveMQ从ActiveMQ的安装路径上的bin目录那里有一个ActiveMQbat双击执行即可不过要注意必须先设置java_home环境变量ActiveMQ默认的服务端口是
然后我们开始配置Spring配置文件我起名为springjmsxml
首先要配置一个ConnectionFactory代码如下
Copy code
<bean id=connectionFactory
class=orgapacheactivemqActiveMQConnectionFactory>
<property name=brokerURL value=tcp://localhost: /> </bean>
这里用到的ConnectionFactory是ActiveMQ提供的工厂为了能使用这个工厂我们必须在项目中添加以下几个jar文件 geronimojms__specjar activeiocorebetajar activemqcorejar backportutilconcurrentjar commonsloggingjar geronimojeemanagement__specjar 以上这些Jar文件都存在于ActiveMQ安装目录的lib目录下这些可是我一个一个试验出来的累个半死
然后应该配置一个Queue(我使用的是点对点方式)不过ActiveMQ只要提供一个名字就可以自动创建队列因此这一步省了
下面就轮到Spring的支持类了首先是JmsTemplate这个类提供了大量的方法简化我们对JMS的操作常用的有两个orgsprreJmsTemplate和orgsprreJmsTemplate这两个类分别支持JMS的版本和版本现在比较常用的还是版本配置如下
Copy code
<bean id=jmsTemplate
class=orgsprreJmsTemplate>
<property name=connectionFactory ref=connectionFactory/>
<property name=timeToLive value=/>
<property name=defaultDestinationName value=cmpp />
<property name=messageConverter ref=messageConverter />
<property name=receiveTimeout value= />
</bean>
上面的配置中用到了第一步配置的connectionFactory以及一个消息转换的类messageConverter这个类实现了orgspringframenverterMessageConverter接口可以在消息发送之前和接受之后进行消息类型转换具体的看最后的实例代码配置代码如下
Copy code
<! Spring JMS SimpleConverter >
<bean id=simpleConverter class=orgspringframenverterSimpleMessageConverter />
<! Message Converter >
<bean id=messageConverter
class=comliangjapmgtjmsApmgtMessageConverter>
<property name=converter>
<ref local=simpleConverter />
</property>
</bean>
这里还配置了发送的消息的存在时间timeToLive目标Queue的名字defaultDestinationName接受消息超时时间receiveTimeout
配置发送代码
Copy code
<! Message porducer >
<bean id=producer
class=comliangjapmgtjmsDefaultApmgtMessageProducer>
<property name=jmsTemplate ref=jmsTemplate />
</bean>
接着配置监听器这是Spring新增的功能配置如下
Copy code
<! this is the Message Driven POJO (MDP) >
<bean id=messageListener
class=orgspringframeworkjmslisteneradapterMessageListenerAdapter>
<constructorarg>
<bean
class=comliangjapmgtjmsDefaultApmgtMessageListener />
</constructorarg>
<property name=defaultListenerMethod value=onMessage />
<property name=messageConverter ref=messageConverter />
</bean>
<! and this is the attendant message listener container >
<bean id=listenerContainer
class=orgspringframeworkjmslistenerDefaultMessageListenerContainer>
<property name=connectionFactory ref=connectionFactory />
<property name=destinationName value=${jmsdestinationNamecmpp} />
<property name=messageSelector value=${ssageSelector} />
<property name=messageListener ref=messageListener />
</bean>
Spring配置监听器有很多种选择在这里我选择这回种MessageListenerAdapter方法主要是因为这个方法比较灵活实现他只要一个很普通的java类即可和JMS以及Spring的耦合度最低其中方法onMessage可以随便修改方法名只要在配置文件中对应的修改就好了
MessageListenerAdapter还有一个功能就是如果处理方法(我这里是onMessage)返回一个非空值它将自动返回一个响应消息这个消息会返回给JMS ReplyTo属性定义的目的地(如果存在)或者MessageListenerAdapter设置(如果配置了)的缺省目的地如果没有定义目的地那么将产生一个InvalidDestinationException异常(此异常将不会只被捕获而不处理它将沿着调用堆栈上传)