Sping集成activeMQ演示queue和topic模式,持久化

 

本文源码: https://download.csdn.net/download/qq_23009109/10605210

包含 activemq服务器, 已经配置好了数据库,按说明改下自己的 mysql数据库地址,用户名和密码,包含queue,topic持久化

第一步:

 一 、下载activemq 官网:http://activemq.apache.org/download.html

二 、点击 ActiveMQ 5.15.5 release ,我选择的是linux版本,解压放在服务器就号

三、解压后进入 bin目录, 启动activemq, 启动 命令 ./activemq start

四、 启动如上图, 浏览器打开,输入http://172.18.58.25:8161/admin/ (172.18.58.25 是我的服务器,换上你自己的就好,下面我就不每个都说明了),如下图,activemq 已经成功启动了

 

第二步:

一 、编写 生产消息

配置spring activemq .xml,(这里就不讲, 如何配置springmvc ,web.xm ,待会在我会上传源码)

           修改 brokerURL="tcp://172.18.58.25:61616", 

<?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:amq="http://activemq.apache.org/schema/core"
	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-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
        http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.12.1.xsd">
		
		<amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://172.18.58.25:61616" 
			userName="admin" password="admin"  />
				
		<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
	  		<property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
			<!-- Session缓存数量 -->
			<property name="sessionCacheSize" value="100" />
		</bean>
		
		<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
			<constructor-arg ref="connectionFactory" />
			<!-- 非pub/sub模型(发布/订阅),即队列模式 -->
			<property name="pubSubDomain" value="false" />
			
			<!-- deliveryMode, priority, timeToLive 的开关要生效,必须配置为true,默认false-->
        	<property name="explicitQosEnabled" value="true"/>
			<!-- 进行持久化    DeliveryMode.NON_PERSISTENT=1:非持久 ;DeliveryMode.PERSISTENT=2:持久  -->
        	<property name="deliveryMode" value="2" />  
		</bean>
		
		<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
			<constructor-arg ref="connectionFactory" />
			<!-- pub/sub模型(发布/订阅) -->
			<property name="pubSubDomain" value="true" />
			<!-- 持久化 -->
        	<property name="deliveryMode" value="2"/>
        	<!-- 存活时间 -->
       	 	<!-- <property name="timeToLive" value="6000000"/> -->
        	<!-- 开启服务质量的开关   开启之后上面的配置才会生效 -->
        	<property name="explicitQosEnabled" value="true"/>
		</bean>
</beans>

 

第三步

编写 queue 发送 工具类

package com.activemq.queue;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;

/**
 * 
 * @author liang
 * @description  队列消息生产者,发送消息到队列
 * 
 */
@Component("queueSender")
public class QueueSender {
	
	@Autowired
	@Qualifier("jmsQueueTemplate")
	private JmsTemplate jmsTemplate;//通过@Qualifier修饰符来注入对应的bean
	
	/**
	 * 发送一条消息到指定的队列(目标)
	 * @param queueName 队列名称
	 * @param message 消息内容
	 */
	public void send(String queueName,final String message){
			jmsTemplate.send(queueName, new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				return session.createTextMessage(message);
			}
		});
	}
	
}

编写topic 发送工具类

package com.activemq.topic;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;

/**
 * 
 * @author liang
 * @description   Topic生产者发送消息到Topic
 * 
 */

@Component("topicSender")
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);
			}
		});
	}

}

 

发送消息 代码事例

package com.activemq.controller;


import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.activemq.queue.QueueSender;
import com.activemq.topic.TopicSender;


/**
 * 
 * Chinese: 登录
 * English: Login
 * ClassName: LoginController
 * date: 2018年7月25日 下午3:33:54
 * @author Mortal
 * @since JDK 1.8
 */
@Controller
@RequestMapping("/login")
public class LoginController extends BaseController{
    
    
    @Resource 
    QueueSender queueSender;
    @Resource 
    TopicSender topicSender;
    
    @RequestMapping(value = "/queueSender", method = RequestMethod.GET)
    public @ResponseBody String queueSender(HttpServletRequest request) {
        try {
            queueSender.send("test.queue2",  request.getParameter("message"));
        } catch (Exception e) {
        }
        return "ok";
    }
    
    

    /**
     * 发送消息到主题
     * Topic主题 :放入一个消息,所有订阅者都会收到 
     * 这个是主题目的地是一对多的
     * @param message
     * @return String
     */
    @ResponseBody
    @RequestMapping("topicSender")
    public String topicSender(@RequestParam("message")String message){
        try {
            topicSender.send("test.topic2", message);
        } catch (Exception e) {
        }
        return "ok";
    }
}

 

 

 

 

 

接下来编写 接受消息

 

编写 sping-activemq

<?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:amq="http://activemq.apache.org/schema/core"
	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-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
        http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.12.1.xsd">
		
		
	<!-- ActiveMQ 连接工厂 -->
 	<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
	<!-- 如果连接网络:tcp://ip:61616;未连接网络:tcp://localhost:61616 以及用户名,密码-->
	<amq:connectionFactory id="amqConnectionFactory"
		brokerURL="tcp://172.18.58.25:61616" userName="admin" password="admin"  />

	<!-- Spring Caching连接工厂 -->
 	<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  
	<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
		<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  
  		<property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
  		<!-- 同上,同理 -->
		<!-- <constructor-arg ref="amqConnectionFactory" /> -->
		<property name="clientId" value="client_119" />
		<!-- Session缓存数量 -->
		<property name="sessionCacheSize" value="100" />
	</bean>
	
	<!-- Spring JmsTemplate 的消息生产者 start-->
	
	<!-- 定义JmsTemplate的Queue类型 -->
	<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
		<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
		<constructor-arg ref="connectionFactory" />
		<!-- 非pub/sub模型(发布/订阅),即队列模式 -->
		<property name="pubSubDomain" value="false" />
	</bean>
	
	<!-- 定义JmsTemplate的Topic类型 -->
	<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
		 <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
		<constructor-arg ref="connectionFactory" />
		<!-- pub/sub模型(发布/订阅) -->
		<property name="pubSubDomain" value="true" />
	</bean>
	
	<!--Spring JmsTemplate 的消息生产者 end-->

	   <!-- 事务管理器 
    <bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
        <property name="connectionFactory" ref="amqConnectionFactory"/>
    </bean>-->
	<!-- 消息消费者 start-->
	
	<!-- 定义Queue监听器 -->
	<jms:listener-container destination-type="queue" container-type="default" connection-factory="connectionFactory" acknowledge="auto">
		<jms:listener destination="test.queue2" ref="queueReceiver1"/>
		<jms:listener destination="test.queue2" ref="queueReceiver2"/>
	</jms:listener-container>
	
	<!-- 定义Topic监听器  acknowledge="auto"-->
	<jms:listener-container destination-type="durableTopic" container-type="default" 
		connection-factory="connectionFactory" acknowledge="auto" >
		<jms:listener subscription="client_005" destination="test.topic2" ref="topicReceiver1"/>
		<jms:listener subscription="client_004" destination="test.topic2" ref="topicReceiver2"/>
	</jms:listener-container>
</beans>

queue 队列监听器 1

 


package com.activemq.queue;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.springframework.stereotype.Component;

/**
 * 
 * @author liang
 * @description  队列消息监听器
 * 
 */
@Component
public class QueueReceiver1 implements MessageListener {

	@Override
	public void onMessage(Message message) {
		try {
			System.out.println("QueueReceiver1接收到消息:"+((TextMessage)message).getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
}

topic 监听器

package com.activemq.topic;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.springframework.stereotype.Component;


/**
 * 
 * @author liang
 * @description  Topic消息监听器
 * 
 */
@Component
public class TopicReceiver1 implements MessageListener{


	@Override
	public void onMessage(Message message) {
		try {
			System.out.println("TopicReceiver1接收到消息:"+((TextMessage)message).getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
	
}

 

 

 

 

没有更多推荐了,返回首页