zoukankan      html  css  js  c++  java
  • 六、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();
                }
            }
        }
    }
  • 相关阅读:
    一行代码搞定Dubbo接口调用
    测试周期内测试进度报告规范
    jq 一个强悍的json格式化查看工具
    浅析Docker容器的应用场景
    HDU 4432 Sum of divisors (水题,进制转换)
    HDU 4431 Mahjong (DFS,暴力枚举,剪枝)
    CodeForces 589B Layer Cake (暴力)
    CodeForces 589J Cleaner Robot (DFS,或BFS)
    CodeForces 589I Lottery (暴力,水题)
    CodeForces 589D Boulevard (数学,相遇)
  • 原文地址:https://www.cnblogs.com/jdy1022/p/14264198.html
Copyright © 2011-2022 走看看