简介
Apache ActiveMQ是一个开源的消息中间件,它不仅完全支持JMS1.1规范,而且支持多种编
程语言,例如C/C++、C#、Delphi 、Erlang 、Adobe Flash 、Haskell 、Java 、JavaScript 、Perl 、 PHP 、Pike 、Python 和 Ruby 等,也支持多种协议,例如 OpenWire 、REST 、STOMP 、WS-Notification 、MQTT 、 XMPP 以及 AMQP 。 Apache ActiveMQ 也提供了对Spring框架的支持,可以非常容易地嵌入Spring中,同时它也提供了集群支持。
一、引入依赖
<!-- ActiveMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!-- ActiveMQ连接池 -->
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
</dependency>
特别说明
使用springboot2.0+及以下版本时候,连接池依赖如下:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
二、yml配置文件
spring:
activemq:
broker-url: tcp://127.0.0.1:61616
user: admin
password: admin
packages:
trust-all: true # 信任所有包,支持对象消息
pool:
enabled: true # 使用连接词
max-connections: 10 # 连接池最大连接数
idle-timeout: 30000ms # 空闲连接过期时间,默认30秒
三、ActiveMQ的配置文件
@EnableJms
@Configuration
public class ActiveMQConfig {
/**
* Queue消息队列
*/
@Bean
public Queue queue(){
return new ActiveMQQueue("active.queue");
}
/**
* Topic消息队列
*/
@Bean
public Topic topic(){
return new ActiveMQTopic("active.topic");
}
/**
* Topic类型的消息必须配置Factory
*/
@Bean
public JmsListenerContainerFactory jmsTopicListenerContainerFactory(ConnectionFactory connectionFactory){
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(true);
return factory;
}
@Bean(name = "test")
public Queue queueTest(){
return new ActiveMQQueue("active.test");
}
}
特别说明
上面的配置文件里,配置了一个@Bean(name = "test")
,是因为我在看其他博文的时候,评论里有说:这就两个两个队列啊,其他名的队列怎么办?我想可能是Spring
没学好或是忘记了怎么注入带name
。@Autowired
默认是按照类型注入,如果你想按name
注入,只需要再加一个@Qualifier("name")
注解即可。或是使用@Resource(name = "name")
代替@Autowired
和@Qualifier
就行。
四、创建消息Pojo类
要想能发送和接收对象消息
,Pojo类需要实现序列化接口。
@Data
public class Message implements Serializable {
private String content;
private Date date;
public Message(String content, Date date) {
this.content = content;
this.date = date;
}
}
五、发送与监听消息
JmsMessagingTemplate
是由 Spring 提供的一个JMS 消息发送模板
,可以用来方便地进行消息
的发送,消息发送方法convertAndSend
的第一个参数是消息队列 ,第二个参数是消息内容。
@Component
public class JmsComponent {
@Autowired
private JmsMessagingTemplate template;
@Autowired
private Queue queue;
@Autowired
private Topic topic;
// @Autowired
// @Qualifier("test")
@Resource(name = "test")
private Queue queueTest;
/**
* 发送Queue消息
*/
public void sendQueueMessage(Message msg){
template.convertAndSend(this.queue,msg);
}
/**
* 发送Topic消息
*/
public void sendTopicMessage(Message msg){
template.convertAndSend(this.topic,msg);
}
/**
* 监听active.queue队列的消息
*/
@JmsListener(destination = "active.queue")
public void receiveQueueMessage(Message msg){
System.out.println("收到消息:" + msg);
}
/**
* 监听active.topic队列的消息
*/
@JmsListener(destination = "active.topic",containerFactory = "jmsTopicListenerContainerFactory")
public void receiveTopicMessage(Message msg){
System.out.println("收到消息:" + msg);
}
}
六、测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestActiveMQ {
@Autowired
private JmsComponent jmsComponent;
@Test
public void testQueueMessage(){
Message message = new Message("发送Queue消息",new Date());
jmsComponent.sendQueueMessage(message);
}
@Test
public void testTopicMessage(){
Message message = new Message("发送Topic消息",new Date());
jmsComponent.sendTopicMessage(message);
}
}
测试截图
更多关于ActiveMQ
,可以自行百度,或是可以参考从0开始Web开发实战】SpringBoot集成ActiveMQ,详细代码手把手操作