摘要:我们这里用我们本地自己的activemq服务器,spring boot自带了
1.添加 maven jar
其他基本配置可以参考我那篇spring boot环境搭建
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!--本地activemq依赖-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
2.application.properties配置
spring.activemq.broker-url = tcp://0.0.0.0:61616
spring.activemq.user = username
spring.activemq.password = pwd
spring.activemq.in-memory = false
spring.activemq.pool.enabled = true
3.生产者 Producer
@Component
@EnableScheduling
public class Producer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Scheduled(fixedDelay=3000)
public void send() {
Date date = new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String format = simpleDateFormat.format(date);
this.jmsMessagingTemplate.convertAndSend(test.queue, format);
}
}
@EnableScheduling 注解的作用是发现注解@Scheduled
@Scheduled 是启动后定时执行某个任务 例如 上面是 3s 执行一次send()
4.Consumer 消费者
@Component
public class Consumer {
@JmsListener(destination = "test.queue")
public void receiveQueue(String text) {
System.out.println("收到queue的消息:"+text);
}
}
注意,默认是发送queue消息,如想把消息发到topic里去
5.消息发送至 topic
只需把 spring.jms.pub-sub-domain=true 加入到 application.properties文件中,其他都不变
但是要共存呢,queue 和 topic 都有需求,看底下
6.queue和topic共存
这时候我们改一下代码,可以直接把前面加的 spring.jms.pub-sub-domain=true注释掉
我们先新建一个jms配置类 JmsConfig
@Configuration //beans
@EnableJms // JMS注解的支持
public class JmsConfig {
private DefaultJmsListenerContainerFactory factory;
@Bean //bean
public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory) {
factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(true);
factory.setConnectionFactory(connectionFactory);
return factory;
}
@Bean
public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory) {
factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(false);
factory.setConnectionFactory(connectionFactory);
return factory;
}
}
再是 生产者
@Component
@EnableScheduling
public class Producer2 {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Scheduled(fixedDelay=3000)
public void send() {
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime date = LocalDateTime.now();
String str = date.format(format);
Destination queue = new ActiveMQQueue("test.queue");
Destination topic_one = new ActiveMQTopic("test.topic_one");
Destination topic_two = new ActiveMQTopic("test.topic_two");
this.jmsMessagingTemplate.convertAndSend(queue, str);
this.jmsMessagingTemplate.convertAndSend(topic_one, str);
this.jmsMessagingTemplate.convertAndSend(topic_two,"test topic_two");
}
}
最后是消费者 containerFactory 对应是的是 JmsConfig类的方法名
@Component
public class Consumer2 {
@JmsListener(destination = "test.topic_one,test.topic_two",containerFactory="topicListenerFactory")
public void topic(String msg) {
System.out.println("topic:"+msg);
}
@JmsListener(destination = "test.queue",containerFactory="queueListenerFactory")
public void queue(String msg) {
System.out.println("queue:"+msg);
}
}
这里注意的是,订阅多个topic,直接往后面添加即可
开启启动类,控制台打印如下
如图所示,queue和topic的消息都接收到了