Spring ActiveMQ整合实例

来源:互联网 发布:淘宝抠图 编辑:程序博客网 时间:2024/05/22 05:00

Spring + ActiveMQ实现生产者消费者模式和发布订阅模式

环境准备

  1. 安装最新版ActiveMQ
  2. Jdk1.8
  3. Spring

创建工程

通过gradle构建项目

引入依赖包

在build.gradle文件中加入以下依赖

    //spring    [group: 'org.springframework', name: 'spring-aop', version: springVersion],    [group: 'org.springframework', name: 'spring-core', version: springVersion],    [group: 'org.springframework', name: 'spring-web', version: springVersion],    [group: 'org.springframework', name: 'spring-jms', version: springVersion],    [group: 'org.springframework', name: 'spring-context-support', version: springVersion],    //JMS    [group: 'org.springframework', name: 'spring-jms', version: springVersion],    [group: 'org.apache.xbean', name: 'xbean-spring', version: '4.6'],    [group: 'org.apache.activemq', name: 'activemq-core', version: '5.7.0'],

配置文件

<?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:amq="http://activemq.apache.org/schema/core"    xmlns:jms="http://www.springframework.org/schema/jms"    xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd           http://www.springframework.org/schema/context           http://www.springframework.org/schema/context/spring-context-4.0.xsd        http://www.springframework.org/schema/jms        http://www.springframework.org/schema/jms/spring-jms-4.0.xsd        http://activemq.apache.org/schema/core        http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd">       <!-- ActiveMQ 连接工厂 -->       <amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://localhost"  userName="admin" password="admin"/>       <!-- Spring Caching 连接工厂 -->       <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->     <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">        <property name="targetConnectionFactory" ref="amqConnectionFactory"></property>        <!-- Session缓存数量 -->        <property name="sessionCacheSize" value="100"></property>       </bean>       <!-- Spring JmsTemplate的消息生产者  -->       <!-- 定义JmsTemplate的Queue -->       <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">        <constructor-arg ref="connectionFactory"/>        <!-- 非发布订阅模式 -->        <property name="pubSubDomain" value="false"></property>       </bean>       <!-- 定义JmsTemplate的Topic类型 -->       <bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">        <constructor-arg ref="connectionFactory"/>        <!-- 发布订阅模式 -->        <property name="pubSubDomain" value="true"></property>       </bean>       <!-- Spring JmsTemplate的消息消费者  -->       <!-- 定义Queue监听器 -->       <jms:listener-container destination-type="queue" container-type="default" connection-factory="connectionFactory">        <jms:listener destination="test.queue" ref="queueReceiver1"/>        <jms:listener destination="test.queue" ref="queueReceiver2"/>       </jms:listener-container>       <!-- 定义Topic监听器 -->       <jms:listener-container destination-type="topic" container-type="default" connection-factory="connectionFactory">        <jms:listener destination="test.topic" ref="topicReceiver1"/>        <jms:listener destination="test.topic" ref="topicReceiver2"/>       </jms:listener-container>       <bean id="topicReceiver1" class="listener.topic.topicReceiver1"></bean>       <bean id="topicReceiver2" class="listener.topic.topicReceiver2"></bean>       <bean id="queueReceiver1" class="listener.queue.queueReceiver1"></bean>       <bean id="queueReceiver2" class="listener.queue.queueReceiver2"></bean></beans>

目录结构

  1. api
    • QueueActiveApi
    • TopicActiveApi
  2. service
    • SendQueueMessage
    • SendTopicMessage
  3. listener
    • queue
    • topic

RESTful Api接口

QueueActiveApi

package api;import java.text.MessageFormat;import javax.ws.rs.Consumes;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.Response;import org.apache.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import service.SendQueueMessage;@Path("active")@Consumes(MediaType.APPLICATION_JSON)@Produces(MediaType.APPLICATION_JSON)public class QueueActiveApi {    private final Logger log = Logger.getLogger(getClass());    private final int counts=10;    @Autowired    private SendQueueMessage sendMessage;    @POST    @Path("/queue")    public Response setSmsActiveQueue() {        log.info("队列模式--开始发送消息");        System.out.println("队列模式--开始发送消息");        for (int i = 1; i < counts; i++) {            String message=MessageFormat.format("我是第{0}条消息", i);            log.info(message);            sendMessage.doSendAction(message);        }        return Response.ok().build();    }}

TopicActiveApi

package api;import java.text.MessageFormat;import javax.ws.rs.Consumes;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.Response;import org.apache.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import service.SendQueueMessage;import service.SendTopicMessage;@Path("active")@Consumes(MediaType.APPLICATION_JSON)@Produces(MediaType.APPLICATION_JSON)public class TopicActiveApi {    private final Logger log = Logger.getLogger(getClass());    private final int counts=10;    @Autowired    private SendTopicMessage sendMessage;    @POST    @Path("/topic")    public Response setSmsActiveTopic() {        log.info("订阅模式--开始发送消息");        System.out.println("订阅模式--开始发送消息");        for (int i = 1; i < counts; i++) {            String message=MessageFormat.format("我是第{0}条消息", i);            sendMessage.doSendAction(message);        }        return Response.ok().build();    }}

发送消息

SendQueueMessage

package service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.jms.core.JmsTemplate;import org.springframework.stereotype.Service;@Servicepublic class SendQueueMessage {    @Autowired    @Qualifier("jmsQueueTemplate")    private JmsTemplate jmsQueueTemplate;    public void doSendAction(String message) {        jmsQueueTemplate.convertAndSend("test.queue",message);    }}

SendTopicMessage

package service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.jms.core.JmsTemplate;import org.springframework.stereotype.Service;@Servicepublic class SendTopicMessage {    @Autowired    @Qualifier("jmsTopicTemplate")    private JmsTemplate jmsTopicTemplate;    public void doSendAction(String message) {        jmsTopicTemplate.convertAndSend("test.topic", message);    }}

消息监听者

Point-to-Point模式实现两个消费者

queueReceiver1

package listener.queue;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;import org.springframework.stereotype.Component;@Componentpublic class queueReceiver1 implements MessageListener{    @Override    public void onMessage(Message message) {        TextMessage tm = (TextMessage) message;        try {            System.out.println("QueueReceiver1接收到消息:"+tm.getText());        } catch (JMSException e) {            e.printStackTrace();        }    }}

queueReceiver2

package listener.queue;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;import org.springframework.stereotype.Component;@Componentpublic class queueReceiver2 implements MessageListener{    @Override    public void onMessage(Message message) {        TextMessage textMessage=(TextMessage) message;        try {            System.out.println("QueueReceiver2接收到消息:"+textMessage.getText());        } catch (JMSException e) {            e.printStackTrace();        }    }}

Pub-Sub模式实现两个订阅者

topicReceiver1

package listener.topic;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;import org.springframework.stereotype.Component;@Componentpublic class topicReceiver1 implements MessageListener{    @Override    public void onMessage(Message message) {        try {            System.out.println("TopicReceiver1接收到消息:"+((TextMessage)message).getText());        } catch (JMSException e) {            e.printStackTrace();        }    }}

topicReceiver2

package listener.topic;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;import org.springframework.stereotype.Component;@Componentpublic class topicReceiver2 implements MessageListener{    @Override    public void onMessage(Message message) {        try {            System.out.println("TopicReceiver1接收到消息:"+((TextMessage)message).getText());        } catch (JMSException e) {            e.printStackTrace();        }    }}

运行结果

  1. 对于Point-to-Point模式,一条消息只会被一个消费者消费
  2. 对于Pub-Sub模式,一条消息会被所有订阅者消费

源码下载https://git.coding.net/liaiyomia/activeMqSpringDemo.git

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 奉贤柘林租房 上海市奉贤区南桥医院 上海奉贤有哪些医院 上海奉贤人民医院 上海奉贤房地产网 上海奉贤中学 上海市奉贤区南桥镇医院 奉贤区哪里有宠物医院 奉贤婚纱摄影 上海奉贤区的医院 莘庄到奉贤怎么走 上海奉贤买房 上海奉贤附近的医院 上海奉贤团购网 奉贤上海大众4s店 奉贤妇幼保健院怎么样 上海市奉贤奉城医院 上海奉贤怎么样 奉贤黄金回收 上海奉贤区医院有哪些 上海奉贤房子 上海奉贤区南桥医院 上海奉贤教育 上海奉贤宾馆 上海奉贤景点 上海奉贤规划 上海奉贤现代农业园区 上海奉贤中心医院电话 上海奉贤工业园区 上海奉贤旅游公司 上海奉贤墓地价格 上海奉贤星火开发区 上海市奉贤中学地址 奉贤西渡论坛 上海奉贤妇幼保健院 上海市奉贤区南桥镇中心医院 上海六院奉贤分院 上海奉贤古华医院 上海奉贤地铁 上海奉贤区南桥镇医院 上海奉贤临时工