之前我們介紹了ActivaMQ與Spring結合,這裏我們再來看一看更加簡便的與SpringBoot的結合使用。首先但是還是需要引入其相關的依賴,如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.15.7</version>
</dependency>
之前由於我們在介紹ActivaMQ與Spring結合結合時,在父項目引入了activemq-all
的依賴,然後就導致了一直報slf4j包的衝突,這裏記得不需要在引入activemq-all
的依賴了
然後爲了代碼容易理解,這裏我們在SpringBoot的項目下,又新建了兩個模塊,一個用於消息的生產,一個用於消息的消費,項目結構如下:
這裏我們先來查看消息的生產者代碼模塊producer,首先我們在application.yml裏面配置了ActiveMQ的相關信息
server:
port: 8081
spring:
activemq:
broker-url: tcp://127.0.0.1:61616
user: admin
password: admin
pool:
enabled: true
max-connections: 10
然後我們就需要配置一個ActiveMQ的配置類 —— ActiveMqConfig
@Configuration
@EnableJms
public class ActiveMqConfig {
@Value("${spring.activemq.user}")
private String user;
@Value("${spring.activemq.password}")
private String password;
@Value("${spring.activemq.broker-url}")
private String brokerUrl;
@Bean
public ConnectionFactory connectionFactory(){
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setUserName(user);
connectionFactory.setPassword(password);
connectionFactory.setBrokerURL(brokerUrl);
return connectionFactory;
}
}
上述的配置文件applicationContext.yml
和配置類ActiveMqConfig
其實在消息的消費者模塊consumer中,其內容也是一樣的,只不過其服務啓動的端口號不同,不然就無法同時啓動了,其餘內容一致,所以就不重複展示了。
接着我們繼續來看消費生產者模塊producer,這裏我們主要來看看是如何發送消息的,如下:
@Component
public class QueueProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private JmsTemplate jmsTemplate; //可用於做更細緻的處理
public void sendMsg(Destination destination, String message){
jmsMessagingTemplate.convertAndSend(destination, message);
jmsTemplate.send(destination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage();
textMessage.setText(message);
return textMessage;
}
});
}
}
然後我們就在測試類中進行測試,消息生產者測試類ProducerTest
如下:
@SpringBootTest(classes = ProducerApplication.class)
@RunWith(SpringRunner.class)
public class ProducerTest {
@Autowired
private QueueProducer queueProducer;
@Test
public void testQueueProducer(){
Destination destination = new ActiveMQQueue("springboot.queue");
queueProducer.sendMsg(destination, "Hello Queue");
}
}
最後當然就是需要看一看在consumer模塊中,消息消費者是如何獲取消息進行消費的,如下:
@Component
public class QueueConsumer {
@JmsListener(destination = "springboot.queue")
public void receiveMsg(String text){
System.out.println(text);
}
}
是不是特別的簡單,我們只需要加上@JmsListener
註解即口,需要注意的是,我們如果想要監聽多個消息目的地的時候,我們就可以直接在方法上加上多個@JmsListener
註解,該註解時運行重複添加多個的,當然也可以使用@JmsListeners
來包含多個。
最後就是我們的測試結果,我們發現消費到了兩條消息,因爲我們在上述使用了不同的方法發送了兩次消息
上述我們講述的是ActiveMQ點對點的模式,肯定還有另一種主題Topic模式,那麼我們就來將上述的例子改爲Topic的模式
首先我們下來看消息的生產者,有哪些需要修改的,其實只需要修改我們的測試類即可,就是在創建消息目的地的方法需要修改,如下:
然後就是需要修改消息的消費者了,消費者修改稍微複雜一些,首先我們需要的配置類ActiveMqConfig
中,添加有關Topic的配置,如下:
然後我們在對方法加上監聽註解@JmsListener
時,主要添加剛剛我們添加的配置Bean,如下:
上述就完成了在SpringBoot下,使用ActiveMQ進行Topic模式的使用。