
ActiveMQ - Spring&SpringBoot整合
前面一篇讲了消息中间件的一些基本概念、JMS协议还列举了原生JMS模式下的开发,这一篇主要讲spring和springboot框架下的开发,比原生模式下还是节省了很多开发时间的
Spring+ActiveMQ
spring与ActiveMQ的整合,有Spring基础的应该知道,除了添加相关依赖外,肯定少不了要写xml的配置文件
1. 添加相关依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| <dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.11.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.0.2.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>javax.jms</groupId> <artifactId>javax.jms-api</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>3.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
|
2. 编写spring整合activemq的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amp="http://activemq.apache.org/schema/core" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
<amp:connectionFactory id="connectionFactory" brokerURL="tcp://127.0.0.1:61616" userName="admin" password="admin" /> <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <property name="targetConnectionFactory" ref="connectionFactory"/> <property name="sessionCacheSize" value="5"/> </bean> <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="cachingConnectionFactory"/> <property name="pubSubDomain" value="false"/> </bean> <bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="cachingConnectionFactory"/> <property name="pubSubDomain" value="true"/> </bean> </beans>
|
3. 完成上面两步后我们就可以正式工作了
这里我把两个模式的生产者写在一个类里
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext-producer.xml") public class SpringProducer { @Autowired @Qualifier("jmsQueueTemplate") private JmsTemplate jmsQueueTemplate;
@Autowired @Qualifier("jmsTopicTemplate") private JmsTemplate jmsTopicTemplate;
@Test public void ptpSender(){
jmsQueueTemplate.send("spring_queue", new MessageCreator() { @Override public Message createMessage(Session session) throws JMSException { TextMessage textMessage = session.createTextMessage("spring test message"); return textMessage; } }); System.out.println("消息发送已完成"); }
@Test public void psSender(){ jmsTopicTemplate.send("spring_topic", new MessageCreator() { @Override public Message createMessage(Session session) throws JMSException { TextMessage textMessage = session.createTextMessage("spring test message--topic"); return textMessage; } }); System.out.println("消息发送已完成"); } }
|
消费者: 用监听器的方式实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
@Component public class QueueListener implements MessageListener {
@Override public void onMessage(Message message) { if(message instanceof TextMessage){ TextMessage textMessage= (TextMessage) message; try { System.out.println("queue接口消息: "+textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } } }
|
SpringBoot+ActiveMQ
上面讲了spring模式下的整合,其实springboot比这个更简单(springboot设计之初本来就是更少的配置文件,所以肯定会更简单)
1. 添加相关依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> </parent>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> </dependencies>
|
2. 编写springboot的配置文件(application.yml)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| server: port: 9091 spring: application: name: activemq-demo
activemq: broker-url: tcp://127.0.0.1:61616 user: admin password: admin
jms: pub-sub-domain: true
activemq: name: springboot_topic
|
3. 编写相关类
生产者:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = ProducerApplication.class) public class SpringbootProducer {
@Autowired private JmsMessagingTemplate jmsMessagingTemplate; @Value("${activemq.name}") private String name;
@Test public void ptpSender(){ jmsMessagingTemplate.convertAndSend(name, "this is springboot message"); } }
|
消费者:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Component public class MsgListener {
@JmsListener(destination = "${activemq.name}") public void receive(Message message){ if (message instanceof TextMessage){ TextMessage textMessage = (TextMessage) message; try { System.out.println("接收消息: "+textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } } }
|
好了,完成!没有很多的文字叙述,个人感觉还是代码更直观!就不展示运行效果了吧,有兴趣的请自己打开idea试试吧~