SpringBoot整合ActiveMQ入门实践
共 1942字,需浏览 4分钟
·
2020-09-23 18:28
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
目标
编写并运行一个Demo直观看出ActiveMQ的效果
步骤
下载ActiveMQ
下载地址:http://activemq.apache.org/components/classic/download/
Linux下载后解压,进入bin目录后,执行“./activemq start”即可网站管理端口:8161
broker端口:61616
构建SpringBoot项目
必要依赖:
spring-boot-starter-web
spring-boot-starter-activemqyml配置:
broker地址:spring.activemq.broker-url
注意用tcp协议而非http协议账号:spring.activemq.user
默认为admin密码:spring.activemq.password
默认为admin
实现Queue和Topic的生产和消费
ActiveMQ下有队列Queue和主题Topic之分
1 Queue是生产者/消费者的模式
消息不会被重复消费,当发出消息时没有消费者时,消息也会保存在broker中,等到出现消费者时供其消费。
2 Topic是发布/订阅的模式
消息一旦发出会被当时存在的所有订阅者消费,当发出消息时没有消费者,消息不会保存。生产者
1 对于Destination,Queue和Topic使用的类是有区别的。
2 框架会根据yml中的服务器信息自动注入生成jmsMessagingTemplate。
@Service
public class Producer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
//Queue消息不能被重复消费 即使没有消费者 消息也会被保存
public void sendQueueMessage(String queueName, String message){
System.out.println("==========>>>>> Queue发送消息: " + message);
Destination destination = new ActiveMQQueue(queueName);
jmsMessagingTemplate.convertAndSend(destination, message);
}
//Topic消息会被所有订阅者消费 没有订阅者时 消息不会保存
public void sengTopicMessage(String topicName, String message){
System.out.println("==========>>>>> Topic发送消息: " + message);
Destination destination = new ActiveMQTopic(topicName);
jmsMessagingTemplate.convertAndSend(destination, message);
}
}
消费者
1 为了让效果明显一些,我各创建了2个Queue消费者和2个Topic消费者。
2 消费者方法名上要加注解@JmsListener,并配置好destination即可实现消费者的功能。
3 ActiveMQ默认pub-sub-domain=false,即不支持Topic,只支持Queue。
4 为了兼容支持Topic,需要对JmsListenerContainerFactory进行自定义配置。
5 Topic消费方法的@JmsListener中的参数containerFactor即为需要自定义配置的项,其值jmsTopicListenerContainer是自定义的方法名字,这个名字随便起,具体配置在下方。
@Service
public class Customer {
@JmsListener(destination = "test.queue")
public void receiveQueueMessage1(String message){
System.out.println("<<<<<========== Mary消费: " + message);
}
@JmsListener(destination = "test.queue")
public void receiveQueueMessage2(String message){
System.out.println("<<<<<========== Jmy消费: " + message);
}
//要配置containerFactory 值为@Bean的方法名
//否则会走默认的配置 默认的只支持Queue 不支持Topic
@JmsListener(destination = "test.topic", containerFactory = "jmsTopicListenerContainer")
public void receiveTopicMessage1(String message){
System.out.println("<<<<<========== Peggy消费: " + message);
}
@JmsListener(destination = "test.topic", containerFactory = "jmsTopicListenerContainer")
public void receiveTopicMessage2(String message){
System.out.println("<<<<<========== Hermione消费: " + message);
}
}
ActiveMQ对于支持Topic的配置
1 主要是为了让pub-sub-domain为true。
2 方法参数ActiveMQConnectionFactory也是框架自动帮忙注入的,而且不用通过@Autowired这样的方式,就写成下边代码所示的那样就行。
3 如果仅仅是下边的代码,启动时还是会报错,要额外在yml中配置spring.jms.cache.enabled=false。
@Configuration
public class ActiveMQConfig {
//主要是配置PubSubDomain为true
//参数connectionFactory的值是根据yml中的配置自动注入的
//一定要在yml中配置spring.jms.cache.enabled = false
@Bean
public JmsListenerContainerFactory> jmsTopicListenerContainer(ActiveMQConnectionFactory connectionFactory){
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(true);
factory.setConnectionFactory(connectionFactory);
return factory;
}
}
效果
测试代码
@SpringBootTest
@RunWith(SpringRunner.class)
public class ActiveMQTest {
@Autowired
private Producer producer;
@Test
public void TestProcess(){
for(int i = 1; i <= 10; i++){
producer.sendQueueMessage("test.queue", "Queue Message: Q" + i);
producer.sengTopicMessage("test.topic", "Topic Message: T" + i);
}
}
}
效果
==========>>>>> Queue发送消息: Queue Message: Q1
<<<<<========== Jmy消费: Queue Message: Q1
==========>>>>> Topic发送消息: Topic Message: T1
<<<<<========== Hermione消费: Topic Message: T1
<<<<<========== Peggy消费: Topic Message: T1
==========>>>>> Queue发送消息: Queue Message: Q2
<<<<<========== Mary消费: Queue Message: Q2
==========>>>>> Topic发送消息: Topic Message: T2
<<<<<========== Hermione消费: Topic Message: T2
<<<<<========== Peggy消费: Topic Message: T2
==========>>>>> Queue发送消息: Queue Message: Q3
<<<<<========== Jmy消费: Queue Message: Q3
==========>>>>> Topic发送消息: Topic Message: T3
<<<<<========== Hermione消费: Topic Message: T3
<<<<<========== Peggy消费: Topic Message: T3
==========>>>>> Queue发送消息: Queue Message: Q4
<<<<<========== Mary消费: Queue Message: Q4
==========>>>>> Topic发送消息: Topic Message: T4
<<<<<========== Hermione消费: Topic Message: T4
<<<<<========== Peggy消费: Topic Message: T4
==========>>>>> Queue发送消息: Queue Message: Q5
<<<<<========== Jmy消费: Queue Message: Q5
==========>>>>> Topic发送消息: Topic Message: T5
<<<<<========== Hermione消费: Topic Message: T5
<<<<<========== Peggy消费: Topic Message: T5
==========>>>>> Queue发送消息: Queue Message: Q6
<<<<<========== Mary消费: Queue Message: Q6
==========>>>>> Topic发送消息: Topic Message: T6
<<<<<========== Hermione消费: Topic Message: T6
<<<<<========== Peggy消费: Topic Message: T6
==========>>>>> Queue发送消息: Queue Message: Q7
<<<<<========== Jmy消费: Queue Message: Q7
==========>>>>> Topic发送消息: Topic Message: T7
<<<<<========== Hermione消费: Topic Message: T7
<<<<<========== Peggy消费: Topic Message: T7
==========>>>>> Queue发送消息: Queue Message: Q8
<<<<<========== Mary消费: Queue Message: Q8
==========>>>>> Topic发送消息: Topic Message: T8
<<<<<========== Hermione消费: Topic Message: T8
<<<<<========== Peggy消费: Topic Message: T8
==========>>>>> Queue发送消息: Queue Message: Q9
<<<<<========== Jmy消费: Queue Message: Q9
==========>>>>> Topic发送消息: Topic Message: T9
<<<<<========== Peggy消费: Topic Message: T9
<<<<<========== Hermione消费: Topic Message: T9
==========>>>>> Queue发送消息: Queue Message: Q10
<<<<<========== Mary消费: Queue Message: Q10
==========>>>>> Topic发送消息: Topic Message: T10
<<<<<========== Hermione消费: Topic Message: T10
<<<<<========== Peggy消费: Topic Message: T10
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:
http://blog.csdn.net/m0_37676106/article/details/108683244
粉丝福利:108本java从入门到大神精选电子书领取
???
?长按上方锋哥微信二维码 2 秒 备注「1234」即可获取资料以及 可以进入java1234官方微信群
感谢点赞支持下哈