spring整合ActiveMQ

本文介绍了如何在Spring中整合ActiveMQ实现订阅者模式。通过单元测试作为生产者发送消息,利用监听器作为消费者接收消息。只有在消费者启动后,生产者发送的消息才会被处理。详细阐述了配置和使用的要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次activeMQ搭建是订阅者模式。

生产者使用单元测试生产消息,消费者通过监听器接收消息。

消费者启动之前,生产者生产的数据不会拿出来。

只有在消费者启动之后,生产者生产的消息才能获取到。


要进入的jar包,创造者和消费者都要引

<dependencies>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.14.5</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.3.RELEASE</version>
        </dependency>

        <!--
             <context:component-scan base-package="com.llk" />
        -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.3.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>

        <!-- spring整合测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.1.3.RELEASE</version>
            <scope>test</scope>
        </dependency>

        <!--
            	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.1.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.5.0</version>
        </dependency>

    </dependencies>
    <build>

        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

        </plugins>

生产者的配置mq配置文件

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



    <!--配置连接工厂-->
    <bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="userName" value="admin"/>
        <property name="password" value="admin"/>
        <property name="brokerURL" value="tcp://192.168.200.128:61616"/>
    </bean>
<!--配置连接池-->
    <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
        <property name="connectionFactory" ref="activeMQConnectionFactory"/>
        <property name="maxConnections" value="7"/>
    </bean>
<!--把连接池换成apache的--> 
    <bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
        <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>
    </bean>

  
  
<!--发送消息的配置-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="singleConnectionFactory"/> <property name="pubSubDomain" value="true"/> <!--<property name="defaultDestinationName" value="heihei"/>--><!--设置默认的主题--> </bean> <context:component-scan base-package="com.llk" /> </beans>

生产者生产消息的方法

 这里是使用单元测试的方式发送消息的

package com.llk.message;

import org.apache.activemq.command.ActiveMQTempTopic;
import org.apache.activemq.command.ActiveMQTopic;
import org.apache.activemq.filter.DefaultDestinationMapEntry;
import org.apache.camel.component.jms.EndpointMessageListener;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Controller;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.jms.*;

@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:mq.xml")
public class SendMesaage {
    @Autowired
    private JmsTemplate jmstemplate;
    @Test
    public void send(){
        //要插入的主题
        String topic="topic1";
        //要插入的内容
        final String val="value1Test";

        /*
            翻译:MessageCreator消息创造者
            发送消息是要传入这个对象,这个是存储信息的类
            因为他是一个接口,所以要创建一个内部类
         */
        MessageCreator message = new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                TextMessage textMessage = session.createTextMessage(val);
                return textMessage;
            }
        };

        //设置要发送的主题,也可以在配置文件注入
        jmstemplate.setDefaultDestinationName(topic);
        //设置要发送的消息
        jmstemplate.send(message);
        System.out.println("结束");

    }
}
消费者的配置文件

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



    <!--配置连接工厂-->
    <bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="userName" value="admin"/>
        <property name="password" value="admin"/>
        <property name="brokerURL" value="tcp://192.168.200.128:61616"/>
    </bean>

    <!--配置连接池-->
    <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
        <property name="connectionFactory" ref="activeMQConnectionFactory"/>
        <property name="maxConnections" value="7"/>
    </bean>
    <!--把连接池换成apache的-->
    <bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
        <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>
    </bean>



    <!--定义消息处理类-->
    <bean id="messageProcession" class="com.llk.MessageProcession"></bean>
    <!--配置消息监听器-->
    <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="singleConnectionFactory"/>
        <property name="destinationName" value="topic1"/>
        <property name="messageListener" ref="messageProcession"/>
        <property name="pubSubDomain" value="true"/>
    </bean>

    <context:component-scan base-package="com.llk" />
</beans>

消费者的接受消息方法

package com.llk;

import org.apache.activemq.command.ActiveMQTextMessage;

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

public class MessageProcession implements MessageListener {

    static {
        System.out.println("执行了吗?");
    }

    @Override
    public void onMessage(Message message) {
       ActiveMQTextMessage atm = (ActiveMQTextMessage)message;
        try {
            String text = atm.getText();
            System.out.println(text);
        } catch (JMSException e) {
            System.out.println("出错了");
        }
    }
}
最后别忘了在web.xml加载配置文件

<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name >contextConfigLocation </param-name >
		<param-value >classpath:mq.xml </param-value >
	</context-param>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值