zoukankan      html  css  js  c++  java
  • spring集成JMS访问ActiveMQ

    首先我们搭建一个spring-mvc项目,项目可以参考:spring-mvc 学习笔记

    步骤:

    1. 在pom.xml中加上需要的包
    2. 修改web.xml,增加IOC容器
    3. spring配置文件application.xml增加对应的bean
    4. 生产者Java代码
    5. 消费者Java代码

    1.在pom.xml加上需要的包

    <!-- ActiveMQ支持 -->
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-core</artifactId>
        <version>5.7.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jms</artifactId>
        <version>4.2.0.RELEASE</version>
    </dependency>
    <!-- spring的IOC容器 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.2.0.RELEASE</version>
    </dependency>
    <!-- 因为ActiveMQ使用了xbean,所以要引用 -->
    <dependency>
        <groupId>org.apache.xbean</groupId>
        <artifactId>xbean-spring</artifactId>
        <version>3.16</version>
    </dependency>

    2.web.xml的根路径下增加对spring容器的监听(注意:是增加,不是覆盖) 

    <web-app>
        <!-- ContextLoaderListener 加载IOC容器,Spring框架的底层是listener -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <!-- 指定Spring的配置文件的路径和名称 -->
            <param-value>classpath:application.xml</param-value>
        </context-param>
        <!-- Bootstraps the root web application context before servlet initialization -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    </web-app>

    3.application.xml文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 查找最新的schemaLocation 访问 http://www.springframework.org/schema/ -->
    <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-4.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.0.xsd
            http://www.springframework.org/schema/jms
            http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
            http://activemq.apache.org/schema/core
            http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd">
    
        <!-- 需要扫描注解的包 -->
        <context:component-scan base-package="cn.duanjt"></context:component-scan>
    
        <!-- 连接工厂,设置地址和用户名密码 -->
        <amq:connectionFactory id="connectionFactory" brokerURL="tcp://127.0.0.1:61616" userName="" password=""></amq:connectionFactory>
    
        <!-- 工厂连接池,池化,提高效率 -->
        <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
            <constructor-arg name="targetConnectionFactory" ref="connectionFactory"></constructor-arg>
            <property name="sessionCacheSize" value="100"></property>
        </bean>
    
        <!-- 定义生产者 -->
        <bean id="jmstemplate" class="org.springframework.jms.core.JmsTemplate">
            <constructor-arg name="connectionFactory" ref="cachingConnectionFactory"></constructor-arg>
            <!-- 是否为订阅模式 -->
            <property name="pubSubDomain" value="false"></property>
        </bean>
    
        <!-- 定义消费者,注册监听器 -->
        <jms:listener-container destination-type="queue" container-type="default" connection-factory="cachingConnectionFactory" acknowledge="auto">
            <jms:listener destination="zd-duanjt" ref="queueReceiver1" />
        </jms:listener-container>
    
    </beans>

    4.生产者的Java代码

    package cn.duanjt.controller;
    
    import javax.jms.*;
    
    import org.springframework.beans.factory.annotation.*;
    import org.springframework.jms.core.*;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    public class ActiveMQController {
        @Autowired
        @Qualifier("jmstemplate")
        private JmsTemplate jmsTemplate;
        
        @RequestMapping("/SendMsg")
        public String SendMsg(String content) {
            System.out.println("接收到数据:" + content);
            // zd-duanjt是ActiveMQ中队列的名称
            jmsTemplate.send("zd-duanjt", new MessageCreator() {
                
                @Override
                public Message createMessage(Session session) throws JMSException {
                    Message message= session.createTextMessage(content);
                    return message;
                }
            });
            
            return "success";
        }
    }

    5.消费者的Java代码

    package cn.duanjt.controller;
    
    import javax.jms.*;
    
    import org.springframework.stereotype.Component;
    
    // 注入到spring容器之后的名称是 queueReceiver1
    @Component
    public class QueueReceiver1 implements MessageListener {
    
        @Override
        public void onMessage(Message message) {
            TextMessage textMessage = (TextMessage) message;
            try {
                System.out.println("从ActiveMQ获取数据:" + textMessage.getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    
    }

    注意:

    1.application.xml文件需要引入ActiveMQ对应的xmlns和xsi:schemaLocation.直接从上面那文件搜索关键字“jms”和"activemq"都是需要引入的。

    2.笔者这里是将生产者和消费者写到了一个程序里面,在具体实现的时候可以分开实现

    3.关于pom.xml引入了xbean。可以参考http://berdy.iteye.com/blog/815309

  • 相关阅读:
    EBS SQL > Form & Report
    oracle sql 优化分析点
    MRP 物料需求计划
    MRPII 制造资源计划
    Barcode128 应用实务
    Oracle SQL语句优化技术分析
    APPSQLAP10710 Online accounting could not be created. AP Invoice 无法创建会计分录
    Oracle数据完整性和锁机制
    ORACLE Responsibility Menu Reference to Other User
    EBS 常用 SQL
  • 原文地址:https://www.cnblogs.com/duanjt/p/10021575.html
Copyright © 2011-2022 走看看