• ActiveMQ用法


    ActiveMQ 和 JMS的关系?

    ActiveMQ是流行的开源消息中间件,JMS是Java平台定义的一种消息传递的标准。ActiveMQ实现了JMS规范,因此可以使用JMS API来与ActiveMQ进行交互。

    JMS定义了一种标准的API。API包括了一些接口和类,用于创建、发送、接收和处理消息。ActiveMQ实现了这些接口和类,并提供了一些额外的功能,例如消息持久化、消息过滤、事务支持等。


    JmsMessagingTemplate跟ActiveMQ的关系?

    JmsMessagingTemplate是Spring框架提供的JMS消息发送工具类,封装了JMS API的细节,使得发送JMS消息变得更加简单和方便。

    JmsMessagingTemplate可以与任何实现了JMS规范的消息中间件集成,包括ActiveMQ。使用JmsMessagingTemplate发送消息时,需要指定目标消息队列或主题,以及消息内容。JmsMessagingTemplate会将消息封装成JMS消息对象,并通过JMS API将消息发送到指定的消息队列或主题。ActiveMQ则负责接收JMS消息,并将其存储在消息队列或主题中,等待消费者进行消费。

    @JmsListener的作用?

    @JmsListener是Spring JMS提供的一个注解,用于监听JMS消息队列或主题,并在收到消息时执行相应的方法。


    ActiveMQ用法

    引入依赖

    <dependencies>
    		<dependency>
    		    <groupId>org.springframework.boot</groupId>
    		    <artifactId>spring-boot-starter-activemq</artifactId>
    		</dependency>
            <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>activemq-client</artifactId>
            </dependency>
        </dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    application.properties配置文件

    spring.activemq.broker-url=tcp://localhost:61616
    spring.activemq.user=admin
    spring.activemq.password=admin
    # 队列名-支持自定义
    spring.activemq.queue-name=queueTest
    # 主题名-支持自定义
    spring.activemq.topic-name=topicTest
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    配置类

    // 加上@EnableJms是异步,不加默认是同步
    @Configuration
    public class ActiveMqConfig {
    
        @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(name = "queue")
        public Queue queue() {
            return new ActiveMQQueue(queueName);
        }
    
        @Bean(name = "topic")
        public Topic topic(){
            return new ActiveMQTopic(topicName);
        }
    
        @Bean
        public ConnectionFactory connectionFactory(){
            return new ActiveMQConnectionFactory(userName, password, brokerUrl);
        }
    
        /**
         * 在Queue模式中,对消息的监听需要对containerFactory进行配置
         * @param connectionFactory
         * @return
         */
        @Bean("queueListener")
        public JmsListenerContainerFactory<?> queueJmsListenerContainerFactory(ConnectionFactory connectionFactory){
            SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
            factory.setConnectionFactory(connectionFactory);
            // false的队列,true是主题
            factory.setPubSubDomain(false);
            return factory;
        }
    
        /**
         * 在topic模式中,对消息的监听需要对containerFactory进行配置
         * @param connectionFactory
         * @return
         */
        @Bean("topicListener")
        public JmsListenerContainerFactory<?> topicJmsListenerContainerFactory(ConnectionFactory connectionFactory){
            SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
            factory.setConnectionFactory(connectionFactory);
            // false的队列,true是主题
            factory.setPubSubDomain(true);
            return factory;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    生产者

    @RestController
    @RequestMapping("/activemq")
    public class ProducerController {
    
        @Resource
        private JmsMessagingTemplate jmsMessagingTemplate;
    
        @Autowired
        private Queue queue;
    
        @Autowired
        private Topic topic;
    
        /**
         * queue模式mq消息发送
         * @param msg
         * @return
         */
        @GetMapping("/queue")
        public String sendQueue(String msg) {
            jmsMessagingTemplate.convertAndSend(queue, msg);
            return "success, 发送消息:" + msg;
        }
    
        /**
         * topic模式一对多的消息队列的生产者
         * @param msg
         */
        @GetMapping("/topic")
        public String sendMsgTopic(@RequestParam String msg){
            jmsMessagingTemplate.convertAndSend(topic,msg);
            return "success, 发送消息:" + msg;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    消费者

    @Component
    public class Consumer {
    	/**
         * queue模式的消费者
         * @param msg
         */
        @JmsListener(destination="${spring.activemq.queue-name}", containerFactory="queueListener")
        public void queueConsumer(String msg) {
            System.out.println("queue收到消息:" + msg);
        }
    
        /**
         * topic模式的消费者
         * @param msg
         */
        @JmsListener(destination = "${spring.activemq.topic-name}", containerFactory = "topicListener")
        public void topicConsumer(String msg){
            System.out.println("topic收到消息:" + msg);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    原文博客:https://blog.csdn.net/imVainiycos/article/details/126021665?spm=1001.2014.3001.5506

  • 相关阅读:
    微信小程序使用方法
    卓岚APP远程采集正泰单相电子式电能表 ZLAN5144J的应用分享
    (超详细)语音信号处理之特征提取
    tinyxml 代码解读
    人工智能轨道交通行业周刊-第13期(2022.9.5-9.11)
    git rebase合并多个commit记录
    MacOS下brew切换为国内源
    如何将MNIST数据集数据图像可视化
    FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?
    计算机网络——第六章笔记(2)
  • 原文地址:https://blog.csdn.net/weixin_42594143/article/details/132858022