源碼地址
springboot2教程系列
activemq安裝
引入依賴
<!-- activemq自動配置依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!-- 連接池依賴 -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
<!-- 如果springboot是2.x.x的版本如果啓用連接池(spring.activemq.pool.enabled=true),就必須引入這個依賴,否則啓動時會報錯,提示找不到JmsMessagingTemplate
springboot是1.5.x的版本就不需要引入,
這是因爲springboot1.5.x使用的是org.apache.activemq.pool.PooledConnectionFactory,
而springboot2.x.x時候用的org.messaginghub.pooled.jms.JmsPoolConnectionFactory,
可以通過源碼查看:
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQConnectionFactoryConfiguration : 負責初始化ConnectionFactory
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration : 負責初始化JmsMessagingTemplate -->
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
<version>1.0.3</version>
</dependency>
配置文件
#spring.activemq.broker-url: tcp://localhost:61616
spring.activemq.broker-url: failover:(tcp://10.10.2.137:61616,tcp://10.10.2.138:61616,tcp://10.10.2.139:61616)
spring.activemq.user: admin
spring.activemq.password: admin
#啓用連接池
spring.activemq.pool.enabled: true
#最大連接數
spring.activemq.pool.max-connections: 100
配置類
@Configuration
@EnableJms
public class ActiveMqConfig {
@Bean("jmsTopicListenerContainerFactory")
public JmsListenerContainerFactory jmsTopicListenerContainerFactory(
ConnectionFactory connectionFactory){
DefaultJmsListenerContainerFactory factory
= new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(true);
return factory;
}
@Bean
public Queue queue() {
return new ActiveMQQueue("springboot.queue") ;
}
@Bean
public Topic topic() {
return new ActiveMQTopic("springboot.topic") ;
}
@Bean("queuereply")
public Queue queuereply() {
return new ActiveMQQueue("springboot.queuereply") ;
}
}
消費者類
@Component
public class Consumer {
@JmsListener(destination="springboot.queue")
public void receiveQueue(String text){
System.out.println(this.getClass().getName()+ "收到的報文爲:"+text);
}
@JmsListener(destination = "springboot.topic",
containerFactory = "jmsTopicListenerContainerFactory"
)
public void receiveTopic(String text) {
System.out.println(this.getClass().getName()+" 收到的報文爲:"+text);
}
@JmsListener(destination="springboot.queuereply")
@SendTo("out.replyTo.queue")
public String receiveQueueReply(String text){
System.out.println(this.getClass().getName()+ "收到的報文爲:"+text);
return "out.replyTo.queue receiveQueueReply";
}
}
生產者類
@Component
public class Producer {
@Autowired
private Queue queue;
@Autowired
private Topic topic;
@Autowired
private Queue queuereply;
@Autowired
private JmsMessagingTemplate jmsTemplate;
public void sendMessage(Destination destination, final String message){
jmsTemplate.convertAndSend(destination, message);
}
public void sendQueueMessage(final String message){
sendMessage(queue, message);
}
public void sendTopicMessage(final String message){
sendMessage(topic, message);
}
public void sendQueueMessageReply(final String message){
sendMessage(queuereply, message);
}
@JmsListener(destination = "out.replyTo.queue")
public void consumerMessage(String text){
System.out.println("從out.replyTo.queue收到報文"+text);
}
}
controller層(測試)
@RestController
public class ActivemqController{
@Autowired
Producer producer;
@RequestMapping("/send/{msg}")
public String send(@PathVariable String msg){
Destination destination = new ActiveMQQueue("springboot.queuereply");
producer.sendMessage(destination, msg);
producer.sendQueueMessage("queue:"+msg);
producer.sendTopicMessage("topic:"+msg);
producer.sendQueueMessageReply("reply:"+msg);
return msg;
}
}