• 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

  • 相关阅读:
    Mybatis集成dbcp-java.lang.AbstractMethodError: Method org/apache/commons/dbcp/DelegatingResultSet.isClosed()Z is abstract
    Word 错误提示“此功能看似已中断,并需要修复” 解决
    解决 org.springframework.context.annotation.ConflictingBeanDefinitionException
    IDEA中的JAVA WEB项目启动报错的定位方法
    Oracle数据库中包含CLOB字段表的导出和导入
    idea terminal修改为gitbash多彩
    企业微信如何发红包 企业微信向个人发红包 企业微信群无法发红包 企业微信无法发红包 企业微信无法发红包如何解决
    vue项目中使用ts(typescript)入门教程
    svg / d3-force 中如何给link的label文字加底色
    svg 如何使用滤镜给文字加底色
  • 原文地址:https://www.cnblogs.com/duanjt/p/10021575.html
Copyright © 2020-2023  润新知