• spring整合jms


    借鉴别人(http://shmilyaw-hotmail-com.iteye.com/blog/2208966),结合自己所用的体会写的,本人用的是servicemix搭的activemq

    一.依赖

       为了运行示例,我们需要有一个activemq的服务器。activemq的下载地址如下:http://activemq.apache.org/download.html 下载到本地解压到某个目录。然后进入到bin目录下

    看你电脑是32,还是64,打开相应的文件夹,如下

       这样activemq服务器就运行起来了。这个时候,服务器的默认brokerURL是: tcp://localhost:61616。在服务器运行起来之后,如果我们想要了解它的详细情况,可以通过一个web console来查看。在浏览器里输入如下地址: http://localhost:8161/admin 输入默认用户名admin和密码admin

    提示:本人是用serviceMix整的,底下的依赖jar可能有所不同,访问地址http://localhost:8181/activemqweb 默认用户名:smx 密码:smx 页面都是一样,只是访问路径不同。

    下面正式开始

    二.项目所需jar(maven)

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.1.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>4.1.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jms</artifactId>
                <version>4.1.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>activemq-all</artifactId>
                <version>5.11.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.servicemix.bundles</groupId>
                <artifactId>org.apache.servicemix.bundles.spring-core</artifactId>
                <version>4.2.6.RELEASE_1</version>
            </dependency>                        

    三.发送消息

      对于spring来说,它收发消息的核心就是jmsTemplate,以下是基本配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:jms="http://www.springframework.org/schema/jms"
           xmlns:context="http://www.springframework.org/schema/context"
           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
        http://www.springframework.org/schema/jms
        http://www.springframework.org/schema/jms/spring-jms-4.0.xsd">
    
        <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="location" value="classpath:jms.properties"/>
        </bean>
    
        <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL" value="${jms.brokerURL}"/>
            <property name="userName" value="${jms.userName}"/>
            <property name="password" value="${jms.password}"/>
        </bean>
    
        <bean id="queueName" class="org.apache.activemq.command.ActiveMQQueue">
            <constructor-arg index="0" value="${jms.messageTopic}" />
        </bean>
    
        <bean id="topicName" class="org.apache.activemq.command.ActiveMQTopic">
            <constructor-arg index="0" value="${jms.messageTopic}" />
        </bean>
    
        <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
            <property name="connectionFactory" ref="connectionFactory"/>
            <!--此处订阅queue就ref="queueName" 订阅topic就ref="topicName"-->
            <property name="defaultDestination" ref="queueName"/>
        </bean>
    
        <bean id="messageSender" class="test.ActivemqMessageSender">
            <constructor-arg index="0" ref="jmsTemplate"/>
        </bean>
    
        <!--topic的监听器-->
        <jms:listener-container container-type="default"  destination-type="topic"
                                connection-factory="connectionFactory" acknowledge="auto" concurrency="10">
            <jms:listener destination="${jms.messageTopic}" ref="messageListener" method="onMessage"/>
        </jms:listener-container>
    
        <!--queue的监听器-->
        <jms:listener-container container-type="default"  destination-type="queue"
                                connection-factory="connectionFactory" acknowledge="auto" concurrency="10">
            <jms:listener destination="${jms.messageTopic}" ref="messageListener" method="onMessage"/>
        </jms:listener-container>
    
        <bean id="messageListener" class="test.ActivemqMessageListener"/>
    
    </beans>

      我们针对前面的内容做一个解释。首先我们需要建立一个类型为org.apache.activemq.ActiveMQConnectionFactory的connectionFactory。这里它定义了我们需要访问的activemq服务器的url以及访问它需要的用户名和密码。

         接着我们定义了两个bean, 一个是org.apache.activemq.command.ActiveMQQueue的destination。它表示对应的一个点对点通信的queue。而后面定义的destinationTopic对应的是采用广播方式通信的topic。我们知道,在jms通信的规范里有两种发送消息的方式,一种是基于点对点的queue的方式,主要用于一个发送者发消息给一个接收者的情况。另外一种则是基于广播的topic的方式,主要用于一个发送者发消息给若干个接收者。

         接着就是我们要用到的关键部分,spring里面预先定义好了的jmsTemplate,它的类型是org.springframework.jms.core.JmsTemplate。它需要配置的两个主要属性分别就是connectionFactory和destination。这样,通过这个模板就已经解决了往哪个服务器的哪个地方发的问题了。剩下的就是我们定义的一个bean,它封装了jmsTemplate来发送消息。

         有了这些配置,我们实际上使用它们的代码则非常简单。我们定义的ActivemqMessageSender的实现代码如下:

    import org.springframework.jms.core.JmsTemplate;
    import org.springframework.stereotype.Component;
    
    @Component
    public class ActivemqMessageSender implements MessageSender  {
    
        private JmsTemplate jmsTemplate;
    
        public ActivemqMessageSender(JmsTemplate jmsTemplate) {
            this.jmsTemplate = jmsTemplate;
        }
    
        @Override
        public void sendMessage(String message) {
            jmsTemplate.convertAndSend(message);
        }
    }

        在上述的代码里,实际上jmsTemplate发送消息的方法有若干个,具体可以看我那jms入门,里面会有详细说明,  我们可以参照文档针对发送的不同类型消息来处理。在示例里我们仅仅是发送一个简单的字符串。

        这里为了保证一定程度的松耦合,专门定义了一个接口MessageSender:

    public interface MessageSender {
        void sendMessage(String message);
    }

        接下来,我们尝试发送一个简单的消息出去:

    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestJms {
        public static void main( String[] args ) {
            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
            MessageSender sender = ctx.getBean(MessageSender.class);
            sender.sendMessage("Hello 1612");
            ctx.close();
        }
    }

    此时看页面

    Properties代码

    四.异步接收消息

    配置文件都在spring.xml里面有说明

    我们定义一个ActivemqMessageListener 类

    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.MessageListener;
    import javax.jms.TextMessage;
    
    public class ActivemqMessageListener implements MessageListener {
        @Override
        public void onMessage(Message msg) {
            TextMessage textMsg = (TextMessage)msg;
            try {
                String message = textMsg.getText();
                System.out.println("message:"+message);
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }

    执行上面TestJms这里就会收到消息

    说明:这里还有一种同步接收消息,就不写了

  • 相关阅读:
    android 访问SD卡的方法
    android 用Achartengine 作图
    hello
    IIS 7.0 "确认文件是否存在"功能
    test
    收藏:如何在Web页面上直接打开、编辑、创建Office文档
    JavaScript面向对象技术
    正则表达式30分钟入门教程
    JWT有状态登陆与无状态登陆
    20条JavaScript代码简洁的写法
  • 原文地址:https://www.cnblogs.com/bkyliufeng/p/7220445.html
Copyright © 2020-2023  润新知