查看原文
其他

SpringBoot整合ActiveMQ实现Queue和Topic两种模式

康熙 终码一生 2022-09-22

点击“终码一生”,关注,置顶公众号

每日技术干货,第一时间送达!



1

前言


最近小编在学习消息队列,然后选中了ActiveMQ,来进行学习.于是探索了好久,来整理一下自己的学习心得!大家一起学习,希望对你有用.我把一些我自己的理解写在注释里了注意看!!



2

ActiveMq的下载和使用


- 下载


大家直接下载解压就可以使用了

链接:https://pan.baidu.com/s/1W0MZtQAya0mOEKMWqJK1iA

提取码:29mz


- 使用




3

依赖准备


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



4

yml文件配置


spring:
 activemq:
  broker-url: tcp://127.0.0.1:61616
  user: admin
  password: admin
  jms:
   pub-sub-domain: true # 默认为false:queue true:topic
queue: queue_mq # 点对点消费名字
topic: topic_mq # 订阅式消费名字



5

配置Bean


@Configuration
@EnableJms
public class ActiveMqConfig {

    @Value("${queue}")//对应yml文件中定义的queue
    private String queue;

    @Value("${topic}")//对应yml文件中定义的topic
    private String topic;
    /**
     * 创建点对点的队列 一个消息只能被一个消费者消费 --- 一对一
     * @return
     */
    @Bean
    public Queue queue(){
        return new ActiveMQQueue(queue);
    }
    /**
     * 创建订阅式的队列 一个消息可以被多个消费者消费 --- 一对多
     * @return
     */
    @Bean
    public Topic topic(){
        return new ActiveMQTopic(topic);
    }
}



6

创建生产者(Queue+Topic)


@RestController
public class ProducerController {

    @Autowired
    private Queue queue;

    @Autowired
    private Topic topic;

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    /**
     * 点对点的消息队列的生产者
     * @param string
     */
    @GetMapping("/queue")
    public void sendMsgQueue(@RequestParam String string){
        System.out.println("消息已经发送,准备被消费,消息为 ---> "+string);
        jmsMessagingTemplate.convertAndSend(queue,string);
    }

    /**
     * 一对多的消息队列的生产者
     * @param string
     */
    @GetMapping("/topic")
    public void sendMsgTopic(@RequestParam String string){
        System.out.println("消息已经发送,准备被消费,消息为 ---> "+string);
        jmsMessagingTemplate.convertAndSend(topic,string);
    }
}



7

创建消费者(Topic模式下)


@Component
public class TopicConsumer {
    
    /**
     * 监听消息,名字为生产者发送的名字,要一致,不然监听不到.
     * 因为是订阅者模式,可以有多个消费者,我们这里举两个来进行测试
     * @param string
     */
    @JmsListener(destination = "${topic}")
    public void consumerTopicOne(String string){
        System.out.println("我是消费者一号:消费消息成功,信息为---> "+string);
    }

    @JmsListener(destination = "${topic}")
    public void consumerTopicTwo(String string){
        System.out.println("我是消费者二号:消费消息成功,信息为---> "+string);
    }
}



8

测试结果(Topic模式下)

 


 

9

网页版查看是否成功(Topic模式下)

 

网站地址  http://127.0.0.1:8161/admin/ 账号密码都是admin





10

创建消费者(Queue模式下)


首先把yml文件中的配置修改为Queue:pub-sub-domain: false


@Component
public class QueueConsumer {

    /**
     * 监听消息,名字为生产者发送的名字,要一致,不然监听不到.
     * 因为是队列模式,只能消费者
     * @param string
     */
    @JmsListener(destination = "${queue}")
    public void consumerQueue(String string){
        System.out.println("消费消息成功,信息为---> "+string);
    }
}



11

测试结果(Queue模式下)

 



12

网页版查看是否成功(Queue模式下)




13

总结


这样我们就搭建好了,并且测试没有问题,比较合适刚刚学习的童鞋们,期待您的关注,一起学习,一起提高哦!!


PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦。


往期推荐



从 JDK 8 到 JDK 17,GC 性能大幅提升!!

每日开源 | 推荐一款java class文件安全加密工具,你也许用得到

面试官:对象不再使用时,为什么要赋值为 null ?

SQL语句中 left join 后用 on 还是 where,区别大了!

面试官:toString()、String.valueOf、String 强转,有啥区别?

IntelliJ IDEA 2021.3 最终版正式发布,还是那么香!(末尾有惊喜)


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存