Spring整合ActiveMQ,实现队列主题消息生产消费

 

1、引入依赖

pom.xml

 1     <!-- activemq -->
 2         <dependency>
 3             <groupId>org.springframework</groupId>
 4             <artifactId>spring-jms</artifactId>
 5             <version>4.3.23.RELEASE</version>
 6         </dependency>
 7 
 8         <dependency>
 9             <groupId>org.apache.activemq</groupId>
10             <artifactId>activemq-pool</artifactId>
11             <version>5.15.9</version>
12         </dependency>

 

2、配置属性文件(配置文件也要加入到spring配置管理中)

activemq.properties
activemq_url=tcp://192.168.0.102:61616
activemq_username=admin
activemq_password=admin

  

 

3、在com.activemq包下增加监听类  

MyMessageListener.java   (队列、主题消费者接收代码)

package com.activemq;

import org.springframework.stereotype.Component;

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

/**
 * 自定义监听类 
* 记得加上注解@Component * @author 。 */ @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(); } } } }

 

 

4、编写配置文件(需要把该配置加入Spring管理中,这里不再说明)

spring-activemq.xml

 

<?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-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
         ">

    <context:annotation-config/>
    <!--扫描类所在位置-->
    <context:component-scan base-package="com.activemq"/>

    <!-- 读取配置文件 -->
    <bean id="propertyPlaceholderConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <array>
                <!-- activemq.properties所在文件路径-->
                <value>/WEB-INF/config/activemq.properties</value>
            </array>
        </property>
    </bean>

    <!--配置生产者-->
    <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
        <property name="connectionFactory">
            <!--真正可以产生Connection的ConnectionFactory,由对应的jms服务厂商提供-->
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL" value="${activemq_url}"/>
                <!--连接的账号密码,没有密码可以不写-->
                <property name="userName" value="${activemq_username}"/>
                <property name="password" value="${activemq_password}"/>
            </bean>
        </property>
        <!--最大连接数-->
        <property name="maxConnections" value="100"></property>
    </bean>

    <!--这个是队列目的地,点对点的-->
    <bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <!--queue是对应名字,这里根据自己的填写-->
        <constructor-arg index="0" value="queue"/>
    </bean>

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

    <!--Spring提供的JMS工具类,进行消息发送、接收-->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="jmsFactory"/>
        <!--
        这里的值destinationQueue对应上面的<bean id="destinationQueue"
        如果这里的值写 destinationQueue 表示是队列
        如果这里的值写 destinationTopic 表示这个是主题
        以上可以根据具体的需要更改
        -->
        <property name="defaultDestination" ref="destinationQueue"/>
        <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"/>
        <!--
        这里的值destinationQueue对应上面的<bean id="destinationQueue"
        如果这里的值写 destinationQueue 表示是队列消费监听
        如果这里的值写 destinationTopic 表示这个是主题消费监听
        以上可以根据具体的需要更改
        -->
        <property name="destination" ref="destinationQueue"/>
        <!--myMessageListener是在上面配置的base-package="com.activemq" 包下的监听类-->
        <property name="messageListener" ref="myMessageListener"/>
    </bean>


</beans>

 

 

 

 

3、队列、主题生产者生产代码 (不可直接使用,这是伪代码,需根据具体情况自行调用send()里面的 jmsTemplate.send 代码方法)

package com.queue.activemq;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

import javax.jms.TextMessage;

public class Produce {

    private JmsTemplate jmsTemplate;

    public void send() {
        WebApplicationContext webctx = ContextLoader.getCurrentWebApplicationContext();
        this.jmsTemplate = (JmsTemplate) webctx.getBean("jmsTemplate");
        /*队列生产者*/
        jmsTemplate.send(session1 -> {
            TextMessage textMessage = session1.createTextMessage("发送的消息内容");
            return textMessage;
        });
    }


}

 

 


posted @ 2020-04-01 20:54  yvioo  阅读(429)  评论(0编辑  收藏  举报