ActiveMq是实现JMS消息服务接口的技术。处理消息的方式有基于Queue的一对一方式和基于Topic的一对多方式。
下面是通过Topic发送常见的异步消息学习记录。
首先下载activemq安装包,我是在window上装的。安装完后,执行安装目录下的activemq.bat启动activemq服务器。
pom.xml依赖
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.6</version> </dependency> <!--ActiveMQ所需要的jar包 --> <!-- 添加ActiveMQ的pool包 --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>5.9.0</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.9.0</version> </dependency> <!--依赖包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> <version>4.0.0.RELEASE</version> </dependency>
在springmvc配置文件applicationContext.xml添加activemq配置。
<!--ActiveMQ相关配置 --> <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> <property name="connectionFactory"> <bean class="org.apache.activemq.ActiveMQConnectionFactory"> <!--activemq消息服务连接信息 --> <property name="brokerURL"> <value>tcp://127.0.0.1:61616</value> </property> <property name="userName"> <value>admin</value> </property> <property name="password"> <value>admin</value> </property> </bean> </property> <!--最大连接数,因为上面是使用了pool --> <property name="maxConnections" value="100"></property> </bean> <!-- queue目的地配置 --> <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg index="0" value="spring-queue" /> </bean> <!-- topic目的地配置,其实不管是topic还是queue则他们的底层实现不同但是通过封装api就差不多了,而在spring中更是简单 --> <bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg index="0" value="spring-topic" /> </bean> <!-- spring 使用jmsTemplate来实现消息的发送和接受 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="jmsFactory"></property> <!--目的地的设置,使用spring来使用activemq时,使用queue还是topic很方便,在这里引用不同地址就ok了 --> <property name="defaultDestination" ref="destinationTopic"></property> </bean> <!--异步监听,消费者1 --> <bean id="consumer1" class="Consumer1"> </bean> <!--异步监听,消费者2 --> <bean id="consumer2" class="Consumer2"> </bean> <bean id="jmsContainer1" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="jmsFactory" /> <property name="destination" ref="destinationTopic" /> <property name="messageListener" ref="consumer1" /> </bean> <bean id="jmsContainer2" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="jmsFactory" /> <property name="destination" ref="destinationTopic" /> <property name="messageListener" ref="consumer2" /> </bean>
消息生产者:
public class QueueProducer { // 负责消息的发送和接收可以理解为MessageProducer 和MessageConsummer的组合。 private static JmsTemplate jt = null; public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml"); // 获取JmsTemplate对象 jt = (JmsTemplate) ctx.getBean("jmsTemplate"); // 调用方法,发送消息 jt.send(new MessageCreator() { // 消息的产生,返回消息发送消息 public Message createMessage(Session s) throws JMSException { ObjectMessage msg = s .createObjectMessage(new User("cj",22)); return msg; } }); System.out.println("Producer send message!"); } }
消息消费者:
public class Consumer1 implements MessageListener { @Override public void onMessage(Message message) { try { User msg = (User)(((ObjectMessage) message).getObject()); System.out.println("Consumer1:" + msg); } catch (JMSException e) { e.printStackTrace(); } } }
这里我注册了2个消费者。用来验证topic能不能一对多订阅消息。
只需要运行消息生产者的main方法,就可以了。
Producer send message! Consumer2:User{name='cj', old=22} Consumer1:User{name='cj', old=22}
涉及到的主要类:
ConnectionFactory :创建连接Connection : JMS客户端与服务端的连接
Destination : 接收消息的目的地
Session : 发送和接收消息的单线程上下文
MessageProducer : 发送消息到目的地
MessageConsumer : 从目的地接收消息
ActiveMQ控制台管理页面:http://localhost:8161/