ActiveMQ专题7 —— Spring整合ActiveMQ

环境准备

  • 启动的ActiveMQ服务
  • JDK1.8+
  • IDEA或Eclipse
  • Maven环境
  • Spring环境依赖

核心依赖

 <!--  activemq  所需要的jar 包-->
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-all</artifactId>
      <version>5.15.9</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>

全部pom依赖,参考

<dependencies>
   <!-- activemq核心依赖包  -->
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-all</artifactId>
        <version>5.10.0</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>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>5.2.1.RELEASE</version>
    </dependency>
    <!-- Spring核心依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.23.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.23.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.3.23.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.3.23.RELEASE</version>
    </dependency>
</dependencies>

配置文件

<?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.huazai.activemq.spring"></context:component-scan>

    <!--配置连接对象-->
    <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://7.98.163.118:61616"/>
            </bean>
        </property>
        <!--配置最大连接数-->
        <property name="maxConnections" value="100"/>
    </bean>

    <!--这个是队列目的地,点对点的Queue-->
    <bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <!--通过构造注入队列名称-->
        <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工具类,他可以进行消息发送,接收等,类似JDBCTemplate-->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <!--传入连接工厂-->
        <property name="connectionFactory" ref="connectionFactory"/>
        <!--传入默认目的地,可以是queue,也可以是topic-->
        <property name="defaultDestination" ref="destinationTopic"/>
        <!--消息自动转换器-->
        <property name="messageConverter">
            <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
        </property>
    </bean>
</beans>

生产者Queue

队列生产者代码:

package com.huazai.activemq.spring.queue;

import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;

import java.util.Scanner;

/**
 * @author pyh
 * @date 2021/01/11 23:39
 */
@Service
public class SpringMQProducer {
    
    
    static final Scanner input = new Scanner(System.in);

    @Autowired
    private final JmsTemplate jmsTemplate;

    @Autowired
    public SpringMQProducer(JmsTemplate jmsTemplate) {
    
    
        this.jmsTemplate = jmsTemplate;
    }

    public static void main(String[] args) {
    
    
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        SpringMQProducer springMQ_producer = applicationContext.getBean(SpringMQProducer.class);
        JmsTemplate jmsTemplate = springMQ_producer.jmsTemplate;
        // 发送消息
        jmsTemplate.send(session -> session.createTextMessage("***Spring和ActiveMQ的整合case....."));
        System.out.println("********send task over");
        while(true) {
    
    
            System.out.println("\n请输入要发送的内容");
            final String msgText = input.next();
            // 输入exit推出程序
            if ("exit".equals(msgText)) {
    
    
                System.exit(-1);
            }
            if (msgText.startsWith("auto:")) {
    
    
                int amount;
                try {
    
    
                    amount = Integer.parseInt(msgText.substring(5));
                } catch (NumberFormatException e) {
    
    
                    System.out.println("auto指令格式错误,正确的应该是:auto:number");
                    continue;
                }
                System.out.println("请稍等...");
                for (int i = 1; i <= amount; i++) {
    
    
                    final int ii = i;
                    jmsTemplate.send(session -> session.createTextMessage(ii + ""));
                }
                System.out.println(msgText + "\t->|\t指令执行完成");
            } else {
    
    
                jmsTemplate.send(session -> session.createTextMessage(msgText));
                System.out.println(msgText + "\t->|\t发送完成");
            }
        }
    }
}

队列消费者代码:

package com.huazai.activemq.spring.queue;

import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;

/**
 * @author pyh
 * @date 2021/01/11 23:39
 */
@Service
public class SpringMQConsumer {
    
    
    @Autowired
    private JmsTemplate jmsTemplate;

    @Autowired
    public void setJmsTemplate(JmsTemplate jmsTemplate) {
    
    
        this.jmsTemplate = jmsTemplate;
    }

    public static void main(String[] args) {
    
    
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        SpringMQConsumer springMQConsumer = applicationContext.getBean(SpringMQConsumer.class);
        while(true) {
    
    
            // 接受消息
            String returnValue = (String) springMQConsumer.jmsTemplate.receiveAndConvert();
            // 输入exit-退出
            if ("exit-".equals(returnValue)) {
    
    
                System.exit(-1);
            }
            System.out.println("****消费者收到的消息: " + returnValue);
        }
    }
}

启动消费者和订阅者,结果如下:
在这里插入图片描述
在这里插入图片描述

生产者Topic

增加核心配置

  <!--主题-->
    <bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg index="0" value="spring-active-topic"></constructor-arg>
    </bean>

在这里插入图片描述消费者和生产者代码不需要改变
就 这 么 简 简 单 单 \color{red}就这么简简单单

监听器实现消费者不启动直接消费消息

applicationContext.xml 监听器配置:

<!--  配置Jms消息监听器  -->
<bean id="defaultMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <!--  Jms连接的工厂     -->
    <property name="connectionFactory" ref="connectionFactory"/>
    <!--   设置默认的监听目的地     -->
    <property name="destination" ref="destinationTopic"/>
    <!--传入默认目的地,可以是queue,也可以是topic-->
    <property name="messageListener" ref="myMessageListener"/>
</bean>

自定义监听器:

package com.huazai.activemq.spring.listener;

import org.springframework.stereotype.Component;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**
 * @author pyh
 * @date 2021/1/12 0:14
 */
@Component
public class MyMessageListener implements MessageListener {
    
    
    @Override
    public void onMessage(Message message) {
    
    
        if (message instanceof TextMessage) {
    
    
            TextMessage textMessage = (TextMessage) message;
            try {
    
    
                System.out.println("消费者收到的消息" + textMessage.getText());
            } catch (JMSException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

增加了监听器之后,在原来代码基础上

  1. 只启动队列生产者
    在这里插入图片描述
    以上案例实现了不启动消费者通过监听器实现queue和topic消息消费。

连更文章

ActiveMQ专题0 —— 前言说明
ActiveMQ专题1 —— 入门概述
ActiveMQ专题2 —— ActiveMQ下载和安装(Linux版)
ActiveMQ专题3 ——Java编码实现ActiveMQ通讯(Queue)
ActiveMQ专题4 ——ActiveMQ专题4 ——Java编码实现ActiveMQ通讯(Topic)
ActiveMQ专题5 ——JMS规范和落地产品
ActiveMQ专题6 ——ActiveMQ的Broker
ActiveMQ专题7 —— Spring整合ActiveMQ
ActiveMQ专题8 —— SpringBoot整合ActiveMQ
ActiveMQ专题9 —— ActiveMQ的传输协议
ActiveMQ专题10 —— ActiveMQ的存储和持久化
ActiveMQ专题11 —— ActiveMQ的存储和持久化2 (续篇)

小总结

知 道 的 越 多 , 不 知 道 的 越 多 , 希 望 对 你 有 帮 助 ! \color{red}知道的越多,不知道的越多,希望对你有帮助!
2021.03.04 ~ 2021.03.06 努力连更中

猜你喜欢

转载自blog.csdn.net/xiaozhegaa/article/details/114450231
今日推荐