首页 > 代码库 > spring整合jms
spring整合jms
借鉴别人(http://shmilyaw-hotmail-com.iteye.com/blog/2208966),结合自己所用的体会写的,本人用的是servicemix搭的activemq
一.依赖
为了运行示例,我们需要有一个activemq的服务器。activemq的下载地址如下:http://activemq.apache.org/download.html 下载到本地解压到某个目录。然后进入到bin目录下
看你电脑是32,还是64,打开相应的文件夹,如下
这样activemq服务器就运行起来了。这个时候,服务器的默认brokerURL是: tcp://localhost:61616。在服务器运行起来之后,如果我们想要了解它的详细情况,可以通过一个web console来查看。在浏览器里输入如下地址: http://localhost:8161/admin 输入默认用户名admin和密码admin
提示:本人是用serviceMix整的,底下的依赖jar可能有所不同,访问地址http://localhost:8181/activemqweb 默认用户名:smx 密码:smx 页面都是一样,只是访问路径不同。
下面正式开始
二.项目所需jar(maven)
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>4.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.11.1</version> </dependency> <dependency> <groupId>org.apache.servicemix.bundles</groupId> <artifactId>org.apache.servicemix.bundles.spring-core</artifactId> <version>4.2.6.RELEASE_1</version> </dependency>
三.发送消息
对于spring来说,它收发消息的核心就是jmsTemplate,以下是基本配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jms="http://www.springframework.org/schema/jms" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.0.xsd"> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="http://www.mamicode.com/classpath:jms.properties"/> </bean> <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="http://www.mamicode.com/${jms.brokerURL}"/> <property name="userName" value="http://www.mamicode.com/${jms.userName}"/> <property name="password" value="http://www.mamicode.com/${jms.password}"/> </bean> <bean id="queueName" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg index="0" value="http://www.mamicode.com/${jms.messageTopic}" /> </bean> <bean id="topicName" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg index="0" value="http://www.mamicode.com/${jms.messageTopic}" /> </bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <!--此处订阅queue就ref="queueName" 订阅topic就ref="topicName"--> <property name="defaultDestination" ref="queueName"/> </bean> <bean id="messageSender" class="test.ActivemqMessageSender"> <constructor-arg index="0" ref="jmsTemplate"/> </bean> <!--topic的监听器--> <jms:listener-container container-type="default" destination-type="topic" connection-factory="connectionFactory" acknowledge="auto" concurrency="10"> <jms:listener destination="${jms.messageTopic}" ref="messageListener" method="onMessage"/> </jms:listener-container> <!--queue的监听器--> <jms:listener-container container-type="default" destination-type="queue" connection-factory="connectionFactory" acknowledge="auto" concurrency="10"> <jms:listener destination="${jms.messageTopic}" ref="messageListener" method="onMessage"/> </jms:listener-container> <bean id="messageListener" class="test.ActivemqMessageListener"/> </beans>
我们针对前面的内容做一个解释。首先我们需要建立一个类型为org.apache.activemq.ActiveMQConnectionFactory的connectionFactory。这里它定义了我们需要访问的activemq服务器的url以及访问它需要的用户名和密码。
接着我们定义了两个bean, 一个是org.apache.activemq.command.ActiveMQQueue的destination。它表示对应的一个点对点通信的queue。而后面定义的destinationTopic对应的是采用广播方式通信的topic。我们知道,在jms通信的规范里有两种发送消息的方式,一种是基于点对点的queue的方式,主要用于一个发送者发消息给一个接收者的情况。另外一种则是基于广播的topic的方式,主要用于一个发送者发消息给若干个接收者。
接着就是我们要用到的关键部分,spring里面预先定义好了的jmsTemplate,它的类型是org.springframework.jms.core.JmsTemplate。它需要配置的两个主要属性分别就是connectionFactory和destination。这样,通过这个模板就已经解决了往哪个服务器的哪个地方发的问题了。剩下的就是我们定义的一个bean,它封装了jmsTemplate来发送消息。
有了这些配置,我们实际上使用它们的代码则非常简单。我们定义的ActivemqMessageSender的实现代码如下:
import org.springframework.jms.core.JmsTemplate; import org.springframework.stereotype.Component; @Component public class ActivemqMessageSender implements MessageSender { private JmsTemplate jmsTemplate; public ActivemqMessageSender(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } @Override public void sendMessage(String message) { jmsTemplate.convertAndSend(message); } }
在上述的代码里,实际上jmsTemplate发送消息的方法有若干个,具体可以看我那jms入门,里面会有详细说明, 我们可以参照文档针对发送的不同类型消息来处理。在示例里我们仅仅是发送一个简单的字符串。
这里为了保证一定程度的松耦合,专门定义了一个接口MessageSender:
public interface MessageSender { void sendMessage(String message); }
接下来,我们尝试发送一个简单的消息出去:
import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestJms { public static void main( String[] args ) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); MessageSender sender = ctx.getBean(MessageSender.class); sender.sendMessage("Hello 1612"); ctx.close(); } }
此时看页面
Properties代码
四.异步接收消息
配置文件都在spring.xml里面有说明
我们定义一个ActivemqMessageListener 类
import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; public class ActivemqMessageListener implements MessageListener { @Override public void onMessage(Message msg) { TextMessage textMsg = (TextMessage)msg; try { String message = textMsg.getText(); System.out.println("message:"+message); } catch (JMSException e) { e.printStackTrace(); } } }
执行上面TestJms这里就会收到消息
说明:这里还有一种同步接收消息,就不写了
spring整合jms