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

相关推荐
FQNmxDG4S4 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全5 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje6 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv76 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫6 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287926 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本6 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211236 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯8 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户60648767188968 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java