Apache ActiveMQ深度解析与实战

需积分: 9 0 下载量 116 浏览量 更新于2024-09-17 收藏 130KB PDF 举报
"ActiveMQ.pdf 开发实例" Apache ActiveMQ 是一个开源的消息中间件,它遵循Java消息服务(JMS)1.1规范,并且能够运行在任何Java虚拟机(JVM)以及大部分Web容器中。这个强大的消息代理提供了多种语言的客户端支持,包括Java、C、C++、AJAX、ACTIONSCRIPT等,同时也支持多种通信协议,如STOMP、OpenWire和REST。此外,ActiveMQ与Spring框架有很好的集成,提升了开发效率。在性能方面,ActiveMQ远超JBossMQ,速度可以达到其十倍。 下载和部署ActiveMQ相当简单。你可以从官方网站(http://activemq.apache.org/activemq-510-release.html)获取5.1.0 Windows Distribution版本,然后将其解压缩到任意目录。启动服务器有两种方式:直接运行bat脚本或通过Ant工具在JVM中嵌入式启动。ActiveMQ的管理后台可以通过http://localhost:8161/admin访问,方便进行消息管理和监控。 为了快速上手,ActiveMQ提供了一些示例程序。例如,Queue消息示例演示了如何创建一个生产者发送消息,而消费者接收消息,两者会在发送/接收2000个消息后自动关闭。Topic消息示例则展示了发布/订阅模式,其中多个消费者(listener)可以同时监听同一个主题(topic),生产者(publisher)每轮发送2000条消息,等待所有消费者的处理结果,然后统计总的发送时间。 在JMS中,Queue和Topic的主要区别在于它们的消息分发策略。Queue遵循负载均衡的语义,即每条消息只会被一个消费者接收,如果有多台消费者,则采用FIFO(先进先出)原则,保证消息的顺序。而Topic则是广播模式,每条消息都会被所有订阅了该Topic的消费者接收,适合用于发布/订阅场景,如日志记录或事件通知,其中所有订阅者都能收到相同的消息。 在实际应用中,选择Queue还是Topic取决于你的需求。Queue适用于那些需要确保消息传递的顺序和只被一个消费者处理的情况,例如工作流中的任务分配。而Topic更适合需要实时广播信息,且希望所有订阅者都能同时接收到信息的场景,如股票交易系统或者天气预报更新。 ActiveMQ的强大还体现在它的可扩展性和灵活性,它支持持久化存储、事务处理、网络连接故障恢复等多种高级特性,使其成为企业级分布式系统中不可或缺的消息传递组件。此外,由于Apache社区的广泛支持和持续开发,ActiveMQ能够及时跟进技术发展,保持其在消息中间件领域的领先地位。

详细说一下一下代码:package com.mcloud.market.mq; import com.mcloud.common.constant.Constants; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.command.ActiveMQQueue; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.config.SimpleJmsListenerContainerFactory; import org.springframework.jms.core.JmsMessagingTemplate; import javax.jms.ConnectionFactory; import javax.jms.Queue; @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; @Bean public Queue queue() { return new ActiveMQQueue(Constants.PREFIX + ".amount"); } @Bean(name = "messageQueue") public Queue amountQueue() { return new ActiveMQQueue(Constants.PREFIX + ".message"); } // 在Queue模式中,对消息的监听需要对containerFactory进行配置 @Bean("queueListener") public JmsListenerContainerFactory<?> queueJmsListenerContainerFactory(ConnectionFactory connectionFactory) { SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setPubSubDomain(false); return factory; } @Bean public ConnectionFactory connectionFactory() { return new ActiveMQConnectionFactory(username, password, brokerUrl); } @Bean public JmsMessagingTemplate jmsMessageTemplate() { return new JmsMessagingTemplate(connectionFactory()); } }

2023-06-06 上传