消息中间件-----ActiveMQ入门Demo

JMS消息服务应用程序结构支持两种模型:

1. 点对点模型
2. 发布者/订阅者模型

1 JMS消息格式

类型
MapMessagekey-value键值对
TextMessage字符串对象
ObjcetMessage一个序列化的Java对象
ByteMessage一个未解释字节的数据流
StreamMessageJava原始值的数据流

2 生产消息

2.1 依赖

	  <dependency>
		  <groupId>org.apache.activemq</groupId>
		  <artifactId>activemq-client</artifactId>
		  <version>5.13.4</version>
	  </dependency>

2.2 配置文件spring-jms-producer.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jms="http://www.springframework.org/schema/jms"
	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">

	<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
	    <property name="brokerURL" value="tcp://192.168.25.133:61616"/>
	</bean>
	   
    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  
	<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  
	<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  
	    <property name="targetConnectionFactory" ref="targetConnectionFactory"/>  
	</bean>  
		   
    <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->  
	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
	    <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
	    <property name="connectionFactory" ref="connectionFactory"/>  
	</bean>

    <!--这个是队列目的地,点对点的  文本信息-->  
	<bean id="queueSearchDestination" class="org.apache.activemq.command.ActiveMQQueue">
	    <constructor-arg value="queue_text_search"/>
	</bean>
	<bean id="queueSearchDeleteDestination" class="org.apache.activemq.command.ActiveMQQueue">
		<constructor-arg value="queue_text_search_delete"/>
	</bean>

	<!--这个是订阅模式  文本信息-->  
	<bean id="topicPageAddDestination" class="org.apache.activemq.command.ActiveMQTopic">
	    <constructor-arg value="pinyougou_topic_page"/>
	</bean>
	<bean id="topicPageDeleteDestination" class="org.apache.activemq.command.ActiveMQTopic">
		<constructor-arg value="pinyougou_topic_page_delete"/>
	</bean>

2.3 生产消息代码实现

	@Autowired
	private JmsTemplate jmsTemplate;

	@RequestMapping("/delete")
	public Result delete(final Long [] ids){
			....
			//发送
			jmsTemplate.send(queueSearchDeleteDestination, new MessageCreator() {
				@Override
				public Message createMessage(Session session) throws JMSException {
					return session.createObjectMessage(ids);
				}
			});
			//发送
			jmsTemplate.send(topicPageDeleteDestination, new MessageCreator() {
				@Override
				public Message createMessage(Session session) throws JMSException {
					return session.createObjectMessage(ids);
				}
			});
			....
	}

3 监听并接受消息

3.1 依赖同生产者

3.2 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jms="http://www.springframework.org/schema/jms"
	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">
	
    <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
	    <property name="brokerURL" value="tcp://192.168.25.133:61616"/>
	</bean>
	   
    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  
	<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  
	<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  
	    <property name="targetConnectionFactory" ref="targetConnectionFactory"/>  
	</bean>  
	
    <!--这个是队列目的地,点对点的  文本信息-->  
	<bean id="queueTextDestination" class="org.apache.activemq.command.ActiveMQQueue">  
	    <constructor-arg value="queue_text_search"/>
	</bean>

	<!--这个是队列目的地,点对点的  文本信息-->
	<bean id="queueTextDeleteDestination" class="org.apache.activemq.command.ActiveMQQueue">
		<constructor-arg value="queue_text_search_delete"/>
	</bean>

	<!--这个是主题目的    生成页面-->
	<bean id="topicPageDestination" class="org.apache.activemq.command.ActiveMQTopic">
		<constructor-arg value="pinyougou_topic_page"/>
	</bean>

	<!-- 消息监听容器   生成页面 -->
	<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="connectionFactory" />
		<property name="destination" ref="topicPageDestination" />
		<property name="messageListener" ref="pageListener" />
	</bean>


	<!--这个是主题目的    删除页面-->
	<bean id="topicPageDeleteDestination" class="org.apache.activemq.command.ActiveMQTopic">
		<constructor-arg value="pinyougou_topic_page_delete"/>
	</bean>

	<!-- 消息监听容器   删除页面 -->
	<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="connectionFactory" />
		<property name="destination" ref="topicPageDeleteDestination" />
		<property name="messageListener" ref="pageDeleteListener" />
	</bean>

	
</beans>

3.3 消费消息

    @Autowired
    private ItemPageService itemPageService;

    @Override
    public void onMessage(Message message) {
        TextMessage textMessage = (TextMessage) message;
        try {
            Long id = Long.valueOf(textMessage.getText());
            System.out.println("监听生成页面:"+id);
            itemPageService.genItemHtml(id);
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

ps:消息发送和接受成功,需要打开消息队列


4 Spring Boot 整合 ActiveMQ

4.1 起步依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>

4.2 配置队列地址

#默认开启点对点
spring.activemq.broker-url=tcp://192.168.25.133:61616
#如果需要开启广播,配置如下
#spring.jms.pub-sub-domain=true

如果需要同时使用点对点以及广播,需要手动注入bean到池中,具体见前面Spring Boot整合activeMQ(原文:https://blog.csdn.net/java_leejin/article/details/97495939 )

4.3发送与监听

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

//发送
//第一个参数:消息目的地名称    第二个参数:消息内容
    	template.convertAndSend("a_queueMQ_1", 
    			"发送了一个queue消息,发送时间:"+new Date().toLocaleString());


//监听消息队列
 @JmsListener(destination="a_queueMQ_1")
    public void consumerQueue(String msg){
    	System.out.println("consumerQueue--接收到消息:"+msg);
    	System.out.println("接收时间:"+new Date().toLocaleString());
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值