ActiveMQ和spring整合,订阅多个topic并实现监听器监听

本文章适用初学ActiveMQ的同学。

本演示为windows下进行

首先下载ActiveMQ

1.ActiveMQ地址 :http://activemq.apache.org/ 

2.下载完成后解压到本地; 这里我是解压在H:\ruanjian\activeMQ 盘

ActiveMQ和spring整合,订阅多个topic并实现监听器监听_第1张图片

 

3.启动本地ActiveMQ服务。

  进入到安装目录双击activemq.bat文件启动,如果启动时窗口一闪而过,可以在cmd窗口,进入按章目录 执行  activemq.bat start 进行启动。

  ActiveMQ和spring整合,订阅多个topic并实现监听器监听_第2张图片

ActiveMQ和spring整合,订阅多个topic并实现监听器监听_第3张图片

 

看到该窗口说明已启动成功,不要关闭此窗口。

接下来就改开发我们的代码了

首先在工程中添加需要的jar包

    
     org.apache.activemq    
     activemq-core  
     5.7.0  
   
    
     org.apache.activemq  
     activemq-pool  
     5.12.1    
  
  
    
     org.springframework    
     spring-jms  
     4.1.3.RELEASE  

这里我们创建两个工程,一个是消息生产者,一个是消息消费者

在我们真实的项目中,我们可能会有这样的需求:

1:在商品添加成功后,需要更新商品的索引;

2:会员注册成功后,向用户发送注册成功邮件;

这两个需求我们都可以通过ActiveMQ来实现,我们发布一个主题,让邮件系统和索引系统订阅这个主题,当邮件系统和索引系统监测有消息来时,我们就可以执行我们具体的业务了。

下来我们介绍具体的配置

我们先看消息生产者的配置:

springmvc的配置这里就不做具体的介绍了,我们详细介绍ActiveMQ的配置文件

spring-mq-active.xml:



 
 






 





 
 





 









一、首先我们要配置连接就是ConnectionFactory;

这里的ConnectionFactory分为JMS厂商提供的ConnectionFactory和spring管理服务厂商ConnectionFactory的ConnectionFactory;

比较绕口,就是说spring要管理JSM厂商的ConnectionFactory;

说明:上边代码中的activeMqConnectionFactory就是ActiveMQ提供的ConnectionFactory,connectionFactory就是spring管理ConnectionFactory 的 ConnectionFactory;

Spring提供的ConnectionFactory只是Spring用于管理ConnectionFactory的,真正产生到JMS服务器链接的ConnectionFactory还得是由JMS服务厂商提供,并且需要把它注入到Spring提供的ConnectionFactory中。我们这里使用的是ActiveMQ实现的JMS,所以在我们这里真正的可以产生Connection的就应该是由ActiveMQ提供的ConnectionFactory

spring提供了三中管理器:

1>、SingleConnectionFactory:对于建立JMS服务器链接的请求会一直返回同一个链接,并且会忽略Connection的close方法调用。
2>、CachingConnectionFactory:继承了SingleConnectionFactory,所以它拥有SingleConnectionFactory的所有功能,同时它还新增了缓存功能,
      它可以缓存Session、MessageProducer和MessageConsumer。我们使用CachingConnectionFactory来作为示例。
3>、PooledConnectionFactory:线程池

配置如下



	
	
	

	


	
	

二、消息发送模板

      连接配置完成后,下来就要配置消息发送模板,既然是发消息我们就要知道是谁发消息,怎么发消息;

      connectionFactory是负责生产消息并发送至JMS服务器;但是具体怎么发,就需要我们的spring提供的JmsTemplate类来实现。所以我们配置消息生产者的核心就是配置JmsTemplate。对于发消息来说,首先是要连接服务器,发什么类型的消息,往哪发。

消息类型:ActiveMQ提供了点对点的队列模式和主题(发布/订阅)模式;










到此消生产者就已经配置完成了。

 

三、消费者配置

所谓消费者就是,消息生产者将消息发送到了JMS服务器,那么就得有消费者处理消费这条信息。消息生产者将消息发送至指定的目的地,那么消费者就要开始消费。

那么消费者是怎样知道生产者给自己发消息了呢?所以每个消费者都应有一个对应的消息监听器MessageListenerContainer。而对于监听器来说它要知道去哪监听,监听哪个消息目的地,所以我们配置向监听既要知道 ConnectionFactory(从哪里监听) 和 destination(监听什么),监听到消息后怎么处理,这三个核心的东西。

  
  
  
  
  
  
  
  
  
  
  
  

connectionFactory这里就不说了,配置同上变的一样。

消费者端ActiveMQ配置文件spring-mq-active.xml



 
 






 





 
 




 


 







生产者控制层

@Controller
@RequestMapping("test")
public class TestController {
	
	@Autowired
	TopicSender topicSender;
	
	@RequestMapping("send")
	@ResponseBody
	public String sendMessage(){
		System.out.println("开始发送消息");
		topicSender.send("goodsAddTopic", "商品添加成功,开始更新商品索引库");
		return "test success";
	}
	
	@RequestMapping("send2")
	@ResponseBody
	public String sendMessage2(){
		System.out.println("开始发送消息-------------2");
		topicSender.send("goods2AddTopic", "商品添加成功,开始更新商品索引库---------2");
		return "test success";
	}
	
}

生产者实现层:

@Component
public class TopicSender {

	@Autowired
	@Qualifier("jmsTopicTemplate")
	private JmsTemplate jmsTemplate;
	
	/**
	 * 发送一条消息到指定的队列(目标)
	 * @param queueName 队列名称
	 * @param message 消息内容
	 */
	public void send(String topicName,final String message){
		jmsTemplate.send(topicName, new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				return session.createTextMessage(message);
			}
		});
	}
	
}

注:TopicSender 类必须要扫描,不扫描会报空指针

消费者监听类:

/**
 * 消息监听器,消息的消费者
 * @author back
 */
public class Goods2ESMessageLister implements SessionAwareMessageListener{


	@Override
	public void onMessage(Message message, Session arg1) throws JMSException {
		try {
            Destination destination = message.getJMSDestination();
            String topic = destination.toString();
            System.out.println("topic====="+topic);
            TextMessage text=(TextMessage) message;
            System.out.println("消息是========"+text.getText());
        }catch (Exception e){

        }
		
	}

}

在运行源代码之前,请先启动您本地的ActiveMQ服务。

你可能感兴趣的:(ActiveMQ)