zoukankan      html  css  js  c++  java
  • 消息中间件JMS(三)

    1. Spring整合JMS

    1.1消息生产者

    创建工程springJMS_producer,并在pom文件中引入SpringJms 、activeMQ以及单元测试相关依赖  

    <properties>
          <spring.version>4.2.4.RELEASE</spring.version>
      </properties>
      
      <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.java.demo"></context:component-scan>     
        
           
        <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->  
        <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
            <property name="brokerURL" value="tcp://192.168.25.129: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>

    在com.java.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 {
                    //在匿名内部类使用外部类的参数,需要用final来修饰
                    return session.createTextMessage(text);
                }
            });
        }
    }
    @Component
    public class TopicProducer {
        
        @Autowired
        private JmsTemplate jmsTemplate;
        @Autowired
        private Destination topicTextDestination;
        
        public void sendTextMessage(final String text) {
            jmsTemplate.send(topicTextDestination, new MessageCreator() {
                
                public Message createMessage(Session session) throws JMSException {
                    return session.createTextMessage(text);
                }
            });
        }
    
    }

    单元测试

    在src/test/java创建测试类

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:applicationContext-jms-producer.xml")
    public class TestQueue {
    
        @Autowired
        private QueueProducer queueProducer;
        @Autowired
        private TopicProducer topicProducer;
        
        @Test
        public void sendText() {
            queueProducer.sendTextMessage("Spring JMS point to point");
        }
        
        @Test
        public void sendText2() {
            topicProducer.sendTextMessage("Spring JMS publish/topic");
        }
        
    }

    1.2 消息消费者

    创建工程springjms_consumer,在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: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">
        
        <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  
        <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
            <property name="brokerURL" value="tcp://192.168.25.129: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="com.java.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>
        
    </beans>

    创建配置文件 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: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">
        
        <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  
        <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
            <property name="brokerURL" value="tcp://192.168.25.129: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="com.java.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>
        
    </beans>

    编写监听类

    public class MyMessageListener implements MessageListener {
    
        public void onMessage(Message message) {
            TextMessage textMessage = (TextMessage) message;
            try {
                System.out.println("接收消息:" + textMessage.getText());
            } catch (JMSException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }

    单元测试

    @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) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:applicationContext-jms-consumer-topic.xml")
    public class TestTopic {
    
        @Test
        public void testQueue() {
            try {
                System.in.read();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    结果:

    (1) 点对点

     

     (2) 发布订阅

     

  • 相关阅读:
    微信公众号扫一扫接口
    JDBC-用户登录验证(sql注入)
    JDBC
    Shell脚本
    java-变量总结
    java-那些方法不能被重写
    java-数组工具类
    java-类初始化与实例初始化
    java-static
    java-native修饰符
  • 原文地址:https://www.cnblogs.com/FanJava/p/10488005.html
Copyright © 2011-2022 走看看