我个人的理解:我们之前介绍的内容也很重要,他更灵活,他支持各种自定义功能,可以满足我们工作中复杂的需求。很多activemq的功能,我们要看官方文档或者博客,这些功能大多是在上面代码的基础上修改完善的。如果非要把这些功能强行整合到spring,就有些缘木求鱼了。我认为另一种方式整合spring更好,就是将上面的类注入到Spring中,其他不变。这样既能保持原生的代码,又能集成到spring。
下面我们将的Spring和SpringBoot整合ActiveMQ也重要,他给我们提供了一个模板,简化了代码,减少我们工作中遇到坑,能够满足开发中90%以上的功能。
一、pom.xml添加依赖
<dependencies> <!--activemq所需要的jar 包--> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.15.9</version> </dependency> <!-- activemq 和 spring 整合的基础包 --> <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>3.16</version> </dependency> <!-- 嵌入式activemq的broker所需要的依赖包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.1</version> </dependency> <!-- activemq连接池 --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>5.15.10</version> </dependency> <!-- spring支持jms的包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>5.2.1.RELEASE</version> </dependency> <!--spring相关依赖包--> <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>4.15</version> </dependency> <!--Spring 核心包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.1.RELEASE</version> </dependency> <!--Spring JDBC--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.2.1.RELEASE</version> </dependency> </dependencies>
二、Spring的ActiveMQ配置文件
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd"> <!--开启包的自动扫描--> <context:component-scan base-package="com.jdy.mq"/> <!-- 配置生产者 --> <bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> <property name="connectionFactory"> <!--真正可以生产Connection的ConnectionFactory,由对应的JMS服务商提供--> <bean class="org.apache.activemq.spring.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://192.168.211.130:61616"/> </bean> </property> <property name="maxConnections" value="100"/> </bean> <!-- 这个是队列目的地,点对点的Queue --> <bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue"> <!--通过构造注入Queue名--> <constructor-arg index="0" value="spring-active-queue"/> </bean> <!--这个是队列目的地,发布订阅的主题Topic--> <bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg index="0" value="spring-active-topic"/> </bean> <!--Spring提供的JMS工具类,他可以进行消息发送,接收等--> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <!--传入连接工厂 --> <property name="connectionFactory" ref="connectionFactory"/> <!-- 传入目的地--> <!-- <property name="defaultDestination" ref="destinationQueue"/>--> <property name="defaultDestination" ref="destinationTopic"/> <!--消息自动转换器--> <property name="messageConverter"> <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/> </property> </bean> <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <!--传入连接工厂 --> <property name="connectionFactory" ref="connectionFactory"/> <!-- 传入目的地--> <property name="defaultDestination" ref="destinationTopic"/> </bean> </beans>
@Service("springmq_producer") public class SpringMQ_Producer { @Autowired private JmsTemplate jmsTemplate; public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-activemq.xml"); SpringMQ_Producer springMQ_producer = applicationContext.getBean("springmq_producer",SpringMQ_Producer.class); springMQ_producer.jmsTemplate.send(session -> { TextMessage textMessage = session.createTextMessage("Spring和ActiveMQ整合案例-01"); return textMessage; }); System.out.println("****send task over****"); } }
四、队列消费者
@Service("springmq_consumer") public class SpringMQ_Consumer { @Autowired private JmsTemplate jmsTemplate; public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-activemq.xml"); SpringMQ_Consumer springMQ_consumer = applicationContext.getBean("springmq_consumer",SpringMQ_Consumer.class); for (; ; ) { String returnValue = (String) springMQ_consumer.jmsTemplate.receiveAndConvert(); System.out.println("****消费者收到的消息: " + returnValue); } } }
配置主题就行,生产者/消费者,可以用和队列复用。
六、配置消费者的监听类
<!--Spring提供的JMS工具类,他可以进行消息发送,接收等--> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <!--传入连接工厂 --> <property name="connectionFactory" ref="connectionFactory"/> <!-- 传入目的地--> <!-- <property name="defaultDestination" ref="destinationQueue"/>--> <property name="defaultDestination" ref="destinationTopic"/> <!--消息自动转换器--> <property name="messageConverter"> <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/> </property> </bean> <!--监听器--> <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <!--传入连接工厂 --> <property name="connectionFactory" ref="connectionFactory"/> <!-- 传入目的地--> <property name="defaultDestination" ref="destinationTopic"/> </bean>
public class MyMessageListener implements MessageListener { @Override public void onMessage(Message message) { if (null != message && message instanceof TextMessage){ TextMessage textMessage = (TextMessage)message; try { System.out.println("****消费者的消息:"+textMessage.getText()); }catch (JMSException e) { e.printStackTrace(); } } } }