六、Spring整合ActiveMQ

  我个人的理解:我们之前介绍的内容也很重要,他更灵活,他支持各种自定义功能,可以满足我们工作中复杂的需求。很多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实现消费者不启动,直接通过配置监听。此时只需要启动生产者,消费者不用启动,自动会监听记录。

<!--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();
            }
        }
    }
}
posted @ 2021-01-11 20:23  jingdy  阅读(444)  评论(0编辑  收藏  举报