SpringBoot集成ActiveMQ

概述

服务器系统:Ubuntu18.04

服务器安装ActiveMQ版本:apache-activemq-5.16.5

SpringBoot版本:2.6.3

SpringBoot集成ActiveMQ

1、pom.xml添加依赖

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

        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
        </dependency>

2、启动类添加注解 @EnableJms

3、yml配置

server:
  port: 8081


spring:
  activemq:
    broker-url: tcp://127.0.0.1:61616
    user: admin
    password: admin
    queue-name: queue-test01  #队列名称
    topic-name: topic-test01  #主题名称
  jms:
    pub-sub-domain: true # 默认为false,点对点模式queue  true订阅模式topic

  pool:
    enabled: true

注意事项:

pub-sub-domain: true 

如果设置为false,那么消费的时候,只能消费queue

如果设置为true,那么消费的时候,只能消费topic

以上说法只能消费queue或者只能消费topic是针对消费者,注解@JmsListener只设置destination参数不设置containerFactory参数,如果设置了containerFactory这个参数,对于是设置true还是false就无所谓了,可以不用设置这个参数了就。

这时候需要进行如下配置,注意和上面的区别,多了对于containerFactory的配置,这个是在消费者的时候会用到。


//MQ配置信息
@Configuration
public class MQConfig {

    @Value("${spring.activemq.broker-url}")
    private String brokerUrl;

    @Value("${spring.activemq.user}")
    private String username;

    @Value("${spring.activemq.password}")
    private String password;

    //队列名称
    @Value("${spring.activemq.queue-name}")
    private String queueName;

    //主题名称
    @Value("${spring.activemq.topic-name}")
    private String topicName;



    //队列Bean对象
    @Bean(name = "queue")
    public Queue queue() {
        return new ActiveMQQueue(queueName);
    }

    //主题Bean对象
    @Bean(name = "topic")
    public Topic topic() {
        return new ActiveMQTopic(topicName);
    }



    @Bean
    public ConnectionFactory connectionFactory(){
        return new ActiveMQConnectionFactory(username, password, brokerUrl);
    }



    //队列模式
    @Bean("queueListener")
    public JmsListenerContainerFactory<?> queueJmsListenerContainerFactory(ConnectionFactory connectionFactory){
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(false);
        return factory;
    }

    //主题模式
    @Bean("topicListener")
    public JmsListenerContainerFactory<?> topicJmsListenerContainerFactory(ConnectionFactory connectionFactory){
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(true);
        return factory;
    }



}

这里有个问题,我还没搞明白,如果自定义设置了ConnectionFactory,如果ActiveMQ断开重启的时候,会报错,不会自动重连 (哭~),应该是需要在创建ConnectionFactory有什么设置,我还没找到,如果不用配置这个,默认是会自动重连的。这一点一定要注意,所以建议没搞懂之前下先别自定义设置ConnectionFactory了。

4、我的MQ配置

//MQ配置信息
@Configuration
public class MQConfig {

    //队列名称
    @Value("${spring.activemq.queue-name}")
    private String queueName;

    //主题名称
    @Value("${spring.activemq.topic-name}")
    private String topicName;



    //创建消息队列Bean对象
    @Bean(name = "queue")
    public Queue queue() {
        return new ActiveMQQueue(queueName);
    }

    //创建消息主题Bean对象
    @Bean(name = "topic")
    public Topic topic() {
        return new ActiveMQTopic(topicName);
    }
}

5、我的生产者

//我的生产者
@Service
public class MyProducer {


    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    //这个是在MQConfig配置中的队列Bean对象
    @Autowired
    private Queue queue;

    //这个是在MQConfig配置中的主题Bean对象
    @Autowired
    private Topic topic;

    //发送队列
    public void sendQueue(String msg){
        this.sendMessage(this.queue,msg);
    }

    //发送主题
    public void sendTopic(String msg){
        this.sendMessage(this.topic,msg);
    }

    //发送消息,destination是发送到的队列,message是待发送的消息
    private void sendMessage(Destination destination, final String message){
        jmsMessagingTemplate.convertAndSend(destination,message);
    }


}

6、我的消费者

//我的消费者
@Service
public class MyConsumer {


    //queue模式的消费者
    @JmsListener(destination = "${spring.activemq.queue-name}")
    public void recvMsg_Queue(String message){
        System.out.println("queue接收到:" + message);
    }




    //topic模式的消费者
    @JmsListener(destination = "${spring.activemq.topic-name}")
    public void recvMsg_Topic(String message){
        System.out.println("topic接收到:" + message);
    }


}

上面只能对一种模式进行消费,要么是queue要么是topic,但是如果想同时既能消费queue又能消费topic,那么就需要再配置的时候对containerFactory参数进行配置了,如下:

//我的消费者
@Service
public class MyConsumer {


    //queue模式的消费者
    @JmsListener(destination = "${spring.activemq.queue-name}",containerFactory = "queueListener")
    //@JmsListener(destination = "${spring.activemq.queue-name}")
    public void recvMsg_Queue(String message){
        System.out.println("queue接收到:" + message);
    }




    //topic模式的消费者
    @JmsListener(destination = "${spring.activemq.topic-name}",containerFactory = "topicListener")
    //@JmsListener(destination = "${spring.activemq.topic-name}")
    public void recvMsg_Topic(String message){
        System.out.println("topic接收到:" + message);
    }


}

7、测试

//我的控制器
@RestController
public class MyController {


    @Autowired
    private MyProducer myProducer;

    @RequestMapping("/testQueue")
    public String sendQueue(String msg){
        myProducer.sendQueue(msg);
        return "queue success";
    }

    @RequestMapping("/testTopic")
    public String sendTopic(String msg){
        myProducer.sendTopic(msg);
        return "topic success";
    }




}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值