Spring整合ActiveMQ使用

本文介绍如何使用Spring框架整合ActiveMQ消息中间件,包括配置连接工厂、创建队列和主题的JmsTemplate,以及实现队列和发布订阅的消费者。

Spring整合ActiveMQ所需的重要jar包(原本使用5.15.1的activemq-all的jar包,结果和4.1.4的spring-context冲突)

  <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-all</artifactId>
      <version>5.13.2</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jms</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-messaging</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>

spring-cfg.xml(省略其他配置)

<?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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/jms
        http://www.springframework.org/schema/jms/spring-jms.xsd
        http://activemq.apache.org/schema/core
        http://activemq.apache.org/schema/core/activemq-core.xsd
"
>
   
    <!--默认mq链接工厂 默认用户密码 admin-->
    <amq:connectionFactory  brokerURL="tcp://localhost:61616" userName="admin" password="admin"
                               id="amqConnectionFactory" />
    <!--整合jms-->
    <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="amqConnectionFactory"/>
        <property name="sessionCacheSize" value="10"/>
    </bean>
    
    <!--队列JmsTemplate-->
    <bean id="queueTemplate" class="org.springframework.jms.core.JmsTemplate">
        <constructor-arg ref="connectionFactory"/>
        <!--是否是发布订阅  false 为队列,true 为发布订阅-->
        <property name="pubSubDomain" value="false"/>
    </bean>
    
    <!--订阅JmsTemplate-->
    <bean id="topicTemplate" class="org.springframework.jms.core.JmsTemplate">
        <constructor-arg ref="connectionFactory"/>
        <!--是否是发布订阅  false 为队列,true 为发布订阅-->
        <property name="pubSubDomain" value="true"/>
    </bean>

    <!--队列消费者 destination为目标地址 ref参考类可自行定义后创建接收类-->
    <jms:listener-container destination-type="queue" connection-factory="connectionFactory">
        <jms:listener destination="zyt.com.queue" ref="queueReceicer1"/>
        <jms:listener destination="zyt.com.queue" ref="queueReceicer2"/>
    </jms:listener-container>

    <!--订阅消费者-->
    <jms:listener-container destination-type="topic" connection-factory="connectionFactory">
        <jms:listener destination="zyt.com.topic" ref="topicReceicer1"/>
        <jms:listener destination="zyt.com.topic" ref="topicReceicer2"/>
    </jms:listener-container>
</beans>

队列和发布订阅 发送类

package zyt.com.user.service;


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;

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

@Component
public class QueueSender {
    //注入spring-cfg中配置的bean @Autowired + @Qualifier = @Resource(j2ee提供)
    @Autowired
    @Qualifier("queueTemplate")
    private JmsTemplate jmsTemplate;

    public void send(String queueName, final String message){
        jmsTemplate.send(queueName, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                 //消息类型自行选择 这边采用TextMessage
                return session.createTextMessage(message);
            }
        });
    }
}


package zyt.com.user.service;


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;

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

@Component
public class TopicSender {

    @Autowired
    @Qualifier("topicTemplate")
    private JmsTemplate jmsTemplate;

    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);
            }
        });
    }
}

接收类

package zyt.com.user.service;


import org.springframework.stereotype.Component;

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

@Component("queueReceicer1")
public class QueueReceicer1 implements MessageListener{
    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("queueReceicer1---接收到:"+((TextMessage)message).getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}


package zyt.com.user.service;


import org.springframework.stereotype.Component;

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

@Component("queueReceicer2")
public class QueueReceicer2 implements MessageListener{
    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("queueReceicer2---接收到:"+((TextMessage)message).getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

package zyt.com.user.service;

import org.springframework.stereotype.Component;

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

@Component
public class TopicReceicer1 implements MessageListener{
    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("topicReceicer1---接收到:"+((TextMessage)message).getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

package zyt.com.user.service;

import org.springframework.stereotype.Component;

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

@Component
public class TopicReceicer2 implements MessageListener {
    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("topicReceicer2---接收到:"+((TextMessage)message).getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

测试Controller

@Controller
@RequestMapping("user")
public class UserController {

    @Autowired
    private QueueSender queueSender;
    @Autowired
    private TopicSender topicSender;

    @RequestMapping("/send")
    public String send(){
        queueSender.send("zyt.com.queue","queueTest");
        topicSender.send("zyt.com.topic","topicTest");
        return "test";
    }

  
}

控制台输出结果


至此整合成功~~~~~~~~~编程虐我千百遍,奈何我爱她如初恋~~~~~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z涛子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值