ActiveMQ —— Spring 整合 ActiveMQ

前文

消息中间件 —— 简介

ActiveMQ 下载、安装

ActiveMQ —— Java 连接 ActiveMQ(点对点)

ActiveMQ —— Java 连接 ActiveMQ(发布订阅 Topic)

ActiveMQ —— Broker

文章目录

  • 前文
  • 添加依赖
  • Spring 配置文件
  • 队列
    • 生产者
    • 消费者
  • 主题
    • 修改 applicationContext.xml 文件
  • 在 Spring 里面实现消费者不启动,直接通过配置监听完成

添加依赖

<dependency>
  <groupId>com.fasterxml.jackson.coregroupId>
  <artifactId>jackson-databindartifactId>
  <version>2.9.5version>
dependency>


<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-jmsartifactId>
  <version>4.3.23.RELEASEversion>
dependency>


<dependency>
  <groupId>org.apache.activemqgroupId>
  <artifactId>activemq-poolartifactId>
  <version>5.15.9version>
dependency>


<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-coreartifactId>
  <version>4.3.25.RELEASEversion>
dependency>

这里的 Spring-core 有版本问题,使用 5.0+ 的整合 ActiveMQ 会报错,使用 4.0 + 的就不会

Spring 配置文件


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/beans">

    
    <context:component-scan base-package="com.java.elasticsearch.activemq"/>

    
    <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
        <property name="connectionFactory">
            
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL" value="tcp://localhost:61616"/>
            bean>
        property>
        
        <property name="maxConnections" value="100"/>
    bean>

    
    <bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
    	
        <constructor-arg index="0" value="spring-active-queue"/>
    bean>

	
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="jmsFactory"/>
        <property name="defaultDestination" ref="destinationQueue"/>
        <property name="messageConverter">
            <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
        property>
     bean>

beans>

队列

生产者

package com.java.elasticsearch.activemq.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;

/**
 * @author Woo_home
 * @create 2020/5/22 14:09
 */

@Service
public class SpringMQ_Produce {

    @Autowired
    private JmsTemplate jmsTemplate;

    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 相当于 new 一个 SpringMQ_Produce,但是这里用的是 Spring,所以这里就不用 new 了
        SpringMQ_Produce produce = (SpringMQ_Produce) ctx.getBean("springMQ_Produce");

        // 普通写法
        /*produce.jmsTemplate.send(new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage textMessage = session.createTextMessage("****** Spring 整合 ActiveMQ ******");
                return textMessage;
            }
        });*/

        // lambda 写法
        produce.jmsTemplate.send((session) -> {
            TextMessage textMessage = session.createTextMessage("****** Spring 整合 ActiveMQ ******");
            return textMessage;
        });
    }
}

执行程序之前先启动 ActiveMQ
ActiveMQ —— Spring 整合 ActiveMQ_第1张图片
执行主程序
ActiveMQ —— Spring 整合 ActiveMQ_第2张图片
刷新 admin 页面,队列已成功添加进来
ActiveMQ —— Spring 整合 ActiveMQ_第3张图片

消费者

消费者端代码非常简单,只需要接收就行了

package com.java.elasticsearch.activemq.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
import javax.jms.TextMessage;

/**
 * @author Woo_home
 * @create 2020/5/22 14:09
 */

@Service
public class SpringMQ_Consumer {

    @Autowired
    private JmsTemplate jmsTemplate;

    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 相当于 new 一个 SpringMQ_Consumer,但是这里用的是 Spring,所以这里就不用 new 了
        SpringMQ_Consumer consumer = (SpringMQ_Consumer) ctx.getBean("springMQ_Consumer");

        String retValue  = (String) consumer.jmsTemplate.receiveAndConvert();

        System.out.println("****** 消费者收到消息 : " + retValue);
    }
}

执行程序
ActiveMQ —— Spring 整合 ActiveMQ_第4张图片
刷新 admin 页面
ActiveMQ —— Spring 整合 ActiveMQ_第5张图片

主题

修改 applicationContext.xml 文件

只需要将以下三处修改为 Topic 即可
ActiveMQ —— Spring 整合 ActiveMQ_第6张图片
生产者与消费者的代码不用修改,直接运行,要是你想修改的话,可以修改如下内容
在这里插入图片描述
在这里插入图片描述
因为这里使用的是 Topic,我们先启动消费端,此时的消费端还没收到信息
ActiveMQ —— Spring 整合 ActiveMQ_第7张图片
ActiveMQ —— Spring 整合 ActiveMQ_第8张图片
再启动生产端
ActiveMQ —— Spring 整合 ActiveMQ_第9张图片
ActiveMQ —— Spring 整合 ActiveMQ_第10张图片
此时,消费端接收到生产者发来的信息
ActiveMQ —— Spring 整合 ActiveMQ_第11张图片

在 Spring 里面实现消费者不启动,直接通过配置监听完成

修改 applicationContext.xml 文件


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/beans">

    
    <context:component-scan base-package="com.java.elasticsearch.activemq"/>

    
    <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
        <property name="connectionFactory">
            
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL" value="tcp://localhost:61616"/>
            bean>
        property>
        
        <property name="maxConnections" value="100"/>
    bean>

    
    <bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
        
        <constructor-arg index="0" value="spring-active-queue"/>
    bean>

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

    
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="jmsFactory"/>
        <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="jmsFactory"/>
        <property name="destination" ref="destinationTopic"/>
        
        <property name="messageListener" ref="myMessageListener"/>
    bean>

beans>

配置监听
ActiveMQ —— Spring 整合 ActiveMQ_第12张图片
这里还需要一个组件

package com.java.elasticsearch.activemq.service;

import org.springframework.stereotype.Component;

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

/**
 * @author Woo_home
 * @create 2020/5/22 14:59
 */

@Component
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();
            }
        }
    }
}

先删除 Topic
ActiveMQ —— Spring 整合 ActiveMQ_第13张图片
启动生产者,可以发现,消费者马上就可以监听到消费者发送的消息
ActiveMQ —— Spring 整合 ActiveMQ_第14张图片
ActiveMQ —— Spring 整合 ActiveMQ_第15张图片


完整代码已上传至码云 代码下载地址

你可能感兴趣的:(#,ActiveMQ)