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用法

引入依赖

java 复制代码
<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>

application.properties配置文件

java 复制代码
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

配置类

java 复制代码
// 加上@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;
    }
}

生产者

java 复制代码
@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;
    }
}

消费者

java 复制代码
@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);
    }
}

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

相关推荐
面朝大海,春不暖,花不开15 分钟前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
得过且过的勇者y16 分钟前
Java安全点safepoint
java
夜晚回家1 小时前
「Java基本语法」代码格式与注释规范
java·开发语言
斯普信云原生组1 小时前
Docker构建自定义的镜像
java·spring cloud·docker
wangjinjin1801 小时前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea
wtg44521 小时前
使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试
java
白宇横流学长1 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
fat house cat_2 小时前
【redis】线程IO模型
java·redis
stein_java3 小时前
springMVC-10验证及国际化
java·spring
weixin_478689763 小时前
C++ 对 C 的兼容性
java·c语言·c++