本文主要写在spring boot下怎样实现JMS的queue 和 topic的消息的发送以及接受。
前序:(1)、安装ActiveMQ。点击打开链接(2)、解压后启动activemq.bat文件(3)、登录http://127.0.0.1:8161/admin 管理界面**初始账号密码都是admin
(1)、创建spring boot项目,添加web 以及 activemq的依赖。
项目构建成功后的布局:
(2)创建生产者 producer
@Service("producer")
public class Producer {
@Autowired
private JmsMessagingTemplate jmsTemplate;
/**消息生产者*/
public void sendMessage(Destination destination, final String message){
jmsTemplate.convertAndSend(destination, message);
}
/**
* 接受从消费者哪里返回的消息
* @param text
*/
@JmsListener(destination = "out.queue")
public void consumerMessage(String text){
//System.out.println("从out.queue返回的消息是"+text);
}
}
(3)构建消费者
@Component
public class Consumer {
// 使用JmsListener配置消费者监听的队列,其中text是接收到的消息
private static int count =1;
/**
* 消费者 使用jmslistener监听目标队列中是否有消息
* @param text
*/
@JmsListener(destination = "mytest.queue",containerFactory = "queueListenerFactory")
public void receiveQueue(String text) {
//System.out.println(Thread.currentThread().getName()+ " Consumer收到的queue 报文为:"+text);
}
/**
* 接受topic的信息
* @param text
*/
@JmsListener(destination = "mytest.topic",containerFactory = "topicListenerFactory")
public void receiveTopic(String text){
System.out.println(Thread.currentThread().getName()+" Consumer收到的topic信息为:"+text+" ("+(count++)+")");
}
}
(3)、构建测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class ActivemqApplicationTests {
@Autowired
private Producer producer;
@Test
public void contextLoads() {
Destination queueDestination = new ActiveMQQueue("mytest.queue");
Destination topicDestination1 =new ActiveMQTopic("mytest.topic");
for(int i=0; i<10; i++){
producer.sendMessage(queueDestination, "myname is queue!!!");
producer.sendMessage(topicDestination1,"myName is topic!!!");
}
}
}
(4)、配置配置类(.properties文件)
spring.activemq.broker-url= tcp://localhost:61616
spring.activemq.in-memory= true
# 如果此处设置为true,需要加如下的依赖包,否则会自动配置失败,报JmsMessagingTemplate注入失败
spring.activemq.pool.enabled= false
# spring.jms.pub-sub-domain= true
(5)、此时启动只能启动queue,无法启动topic是由于JMS默认启动queue,如果想要启动topic需要将配置文件中spring.jms.pub-sub-domain=true放开,但是此时将仅仅启动topic,解决办法是将消费者使用不同的连接工厂类,并设置其pub-sub-domain属性,topic为true,queue为false即可。
(6)、添加配置类
@Configuration
@EnableJms
public class JmsConfig {
@Bean
public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory){
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(true);
factory.setConnectionFactory(connectionFactory);
//factory.setTaskExecutor(Executors.newFixedThreadPool(10));
//factory.setConcurrency("10");
return factory;
}
@Bean
public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory){
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(false);
factory.setConnectionFactory(connectionFactory);
return factory;
}
}