最简单的Spring整合JMS学习

      上一张我们已经学习了关于JMS的一些基础知识,当时我们已经提到,在实际开发中,我们一般都是过过spring去整合jms的方式把jms应用到我们的项目中.那么接下来我们就来探讨一下spring整合jms相关的内容!

    spring整合jms后对于开发者来说要开发一个jms相关的中间件那就非常简单啦!学习过spring全家桶的小伙伴们都知道,被spring整合过的大多数技术,spring都会给我们提供一个模板类去使用封装后的技术.

另外我要说的是,由于在实际开发中,生产者和消费者肯定不是一个工程(如果是那也没必要用啦),所以接下来我们将会创建两个工程来进行测试.首先我们先来看看

点对点模式

创建消息生产者

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


    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-client</artifactId>
            <version>5.13.4</version>
        </dependency>
    </dependencies>

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.apache.org/schema/core"
	xmlns:jms="http://www.springframework.org/schema/jms"
	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">
		
		
	<context:component-scan base-package="com.springjms"></context:component-scan>     
	
	   
    <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
	    <property name="brokerURL" value="tcp://192.168.218.128: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>    
	
	<!--这个是订阅模式  文本信息-->  
	<bean id="topicTextDestination" class="org.apache.activemq.command.ActiveMQTopic">  
	    <constructor-arg value="topic_text"/>  
	</bean>  
	
</beans>

创建消息生产者类QueueProducer

/**
 * springjs点对点方式的生产者类
 */
@Component
public class QueueProducer {

    //注入模板
    @Autowired
    private JmsTemplate jmsTemplate;

    //注入点对点文本消息对象,我们使用他的父接口
    @Autowired
    private Destination queueTextDestination;

    //发送消息的方法
    public void sendTextMessage(String text){

        //使用模板发送消息,我们只需要queueTextDestination给模板,其他的框架会帮我们搞定啦
        jmsTemplate.send(queueTextDestination, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {

                //创建返回消息
                return session.createTextMessage(text);
            }
        });
    }

}

创建测试类

/**
 * springjms点对点生产者测试类
 */

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext-jms-producer.xml")
public class QueueProducerTest {

    @Autowired
    private QueueProducer queueProducer;

    @Test
    public void sendTextMessage(){

        queueProducer.sendTextMessage("我的第一个点对点springjms小程序测试成功啦!");
    }
}

查看activeMQ管理客服端

现在我们创建第二个工程,消息消费者来使用我们刚刚发布的消息,在POM文件中引入依赖 (同上一个工程)

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jms="http://www.springframework.org/schema/jms"
	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">
	
    <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
	    <property name="brokerURL" value="tcp://192.168.218.128: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="CustomMessageListener" class="com.springjms.CustomMessageListener"></bean>
	<!-- 消息监听容器 -->
	<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="connectionFactory" />
		<property name="destination" ref="queueTextDestination" />
		<property name="messageListener" ref="CustomMessageListener" />
	</bean>
	
</beans>

编写监听类


/**
 * springjms点对点消息消费者类
 */
public class CustomMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message) {
        //我们知道我们发送的消息类型,强转成我们的类型即可
        TextMessage textMessage= (TextMessage) message;

        try {
            System.out.println("接收到消息:"+textMessage.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

编写测试类

/**
 * springjms点对点消费者测试类
 */

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext-jms-consumer.xml")
public class TestQueue {

    @Test
    public void testQueue() throws IOException {

        System.in.read();
    }
}

控制台输出信息

active客服端信息

发布/订阅模式 

消息生产者

在工程springjms_producer的applicationContext-jms-producer.xml增加配置,复制过来的文件已有

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

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

        <constructor-arg value="topic_text"/> 

    </bean> 

创建生产者类

/**
 * springjs发布订阅方式的生产者类
 */
@Component
public class TopicProducer {

    //注入模板
    @Autowired
    private JmsTemplate jmsTemplate;

    //注入点对点文本消息对象,我们使用他的父接口
    @Autowired
    private Destination topicTextDestination;

    //发送消息的方法
    public void sendTextMessage(String text){

        //使用模板发送消息,我们只需要queueTextDestination给模板,其他的框架会帮我们搞定啦
        jmsTemplate.send(topicTextDestination, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {

                //创建返回消息
                return session.createTextMessage(text);
            }
        });
    }

}

测试类

/*
*发布订阅模式测试方法
*/  
@Autowired
    private TopicProducer topicProducer;

    @Test
    public void sendTextMessage2(){

        topicProducer.sendTextMessage("我的第一个发布订阅模式springjms小程序测试成功啦!");
    }

看看activemq客服端管理界面

 

下面我们该写一个消费者测试类来测试我们的程序啦!

  1. 在activemq-spring-consumer工程中创建配置文件applicationContext-jms-consumer-topic.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jms="http://www.springframework.org/schema/jms"
	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">

	<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL" value="tcp://192.168.218.128: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="customMessageListener" class="com.springjms.CustomMessageListener"></bean>
	<!-- 消息监听容器 -->
	<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="connectionFactory" />
		<property name="destination" ref="topicTextDestination" />
		<property name="messageListener" ref="customMessageListener" />
	</bean>
	</beans>

 消费者监听器我们就可以用之前那个啦

我们只需要创建测试类即可


/**
 * 发布订阅模式消费者测试类
 */
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:applicationContext-jms-consumer-topic.xml")
    public class TestTopic {

        @Test
        public void testTopic() throws IOException {

            System.in.read();
        }
}

下面我们可以同时启动几个消费者看看是否如我们期望的那样呢?

哈哈,确实如我们期望的那样,三个消费者都收到了消息啦!

下面我们再看看activemq客服端情况

 

猜你喜欢

转载自blog.csdn.net/luo609630199/article/details/82684721