首页 > 技术文章 > Spring整合JMS消息中间件

hxun 2019-07-26 09:23 原文

1、 点对点模式

1.1消息生产者

(1)创建工程springjms_producer,在POM文件中引入SpringJms activeMQ以及单元测试相关依赖  

2)在src/main/resources下创建spring配置文件applicationContext-jms-producer.xml

<context:component-scan base-package="cn.itcast.demo"></context:component-scan>        

    <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  

<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  

    <property name="brokerURL" value="tcp://192.168.25.135:61616"/>  

</bean>          

    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  

<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  

<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  

    <property name="targetConnectionFactory" ref="targetConnectionFactory"/>  

</bean>      

    <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->  

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  

    <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  

    <property name="connectionFactory" ref="connectionFactory"/>  

</bean>      

    <!--这个是队列目的地,点对点的  文本信息-->  

<bean id="queueTextDestination" class="org.apache.activemq.command.ActiveMQQueue">  

    <constructor-arg value="queue_text"/>  

</bean>    

3)在cn.itcast.demo包下创建消息生产者类

@Component

public class QueueProducer {

 

@Autowired

private JmsTemplate jmsTemplate;

 

@Autowired

private Destination queueTextDestination;

 

/**

 * 发送文本消息

 * @param text

 */

public void sendTextMessage(final String text){

jmsTemplate.send(queueTextDestination, new MessageCreator() {

public Message createMessage(Session session) throws JMSException {

return session.createTextMessage(text);

}

});

}

}

4)单元测试

src/test/java创建测试类

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations="classpath:applicationContext-jms-producer.xml")

public class TestQueue {

 

@Autowired

private QueueProducer queueProducer;

 

@Test

public void testSend(){

queueProducer.sendTextMessage("SpringJms-点对点");

}

}

1.2消息消费者

(1)创建工程springjms_consumer,在POM文件中引入依赖 (同上一个工程)

2)创建配置文件 applicationContext-jms-consumer-queue.xml

    <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  

<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  

    <property name="brokerURL" value="tcp://192.168.25.135:61616"/>  

</bean>    

    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  

<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  

<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  

    <property name="targetConnectionFactory" ref="targetConnectionFactory"/>  

</bean>  

    <!--这个是队列目的地,点对点的  文本信息-->  

<bean id="queueTextDestination" class="org.apache.activemq.command.ActiveMQQueue">  

    <constructor-arg value="queue_text"/>  

</bean>    

<!-- 我的监听类 -->

<bean id="myMessageListener" class="cn.itcast.demo.MyMessageListener"></bean>

<!-- 消息监听容器 -->

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">

<property name="connectionFactory" ref="connectionFactory" />

<property name="destination" ref="queueTextDestination" />

<property name="messageListener" ref="myMessageListener" />

</bean>

3)编写监听类

public class MyMessageListener implements MessageListener {

public void onMessage(Message message) {

TextMessage textMessage=(TextMessage)message;

try {

System.out.println("接收到消息:"+textMessage.getText());

} catch (JMSException e) {

e.printStackTrace();

}

}

}

4)创建测试类

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations="classpath:applicationContext-jms-consumer-queue.xml")

public class TestQueue {

@Test

public void testQueue(){

try {

System.in.read();

} catch (IOException e) {

e.printStackTrace();

}

}

}

2、发布/订阅模式

2.1消息生产者

1)在工程springjms_producerapplicationContext-jms-producer.xml增加配置

<!--这个是订阅模式  文本信息-->  

<bean id="topicTextDestination" class="org.apache.activemq.command.ActiveMQTopic">  

    <constructor-arg value="topic_text"/>  

</bean>  

2)创建生产者类

@Component

public class TopicProducer {

@Autowired

private JmsTemplate jmsTemplate;

 

@Autowired

private Destination topicTextDestination;

 

/**

 * 发送文本消息

 * @param text

 */

public void sendTextMessage(final String text){

jmsTemplate.send(topicTextDestination, new MessageCreator() {

public Message createMessage(Session session) throws JMSException {

return session.createTextMessage(text);

}

});

}

}

3)编写测试类

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import cn.itcast.demo.TopicProducer;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations="classpath:applicationContext-activemq-producer.xml")

public class TestTopic {

@Autowired

private TopicProducer topicProducer;

@Test

public void sendTextQueue(){

topicProducer.sendTextMessage();

}

}

2.2消息消费者

(1)activemq-spring-consumer工程中创建配置文件applicationContext-jms-consumer-topic.xml

    <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  

<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  

    <property name="brokerURL" value="tcp://192.168.25.135:61616"/>  

</bean>

    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  

<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  

<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  

    <property name="targetConnectionFactory" ref="targetConnectionFactory"/>  

</bean>  

    <!--这个是队列目的地,点对点的  文本信息-->  

<bean id="topicTextDestination" class="org.apache.activemq.command.ActiveMQTopic">  

    <constructor-arg value="topic_text"/>  

</bean>    

<!-- 我的监听类 -->

<bean id="myMessageListener" class="cn.itcast.demo.MyMessageListener"></bean>

<!-- 消息监听容器 -->

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">

<property name="connectionFactory" ref="connectionFactory" />

<property name="destination" ref="topicTextDestination" />

<property name="messageListener" ref="myMessageListener" />

</bean>

(2)编写测试类

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations="classpath:applicationContext-jms-consumer-topic.xml")

public class TestTopic {

@Test

public void testTopic(){

try {

System.in.read();

} catch (IOException e) {

e.printStackTrace();

}

}

}

测试:同时运行三个消费者工程,在运行生产者工程,查看三个消费者工程的控制台输出。

 

 

完毕!留个赞再走呗 (* ̄︶ ̄) !

 

推荐阅读