首页 > 代码库 > spring整合jms

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="http://www.mamicode.com/classpath:jms.properties"/>
    </bean>

    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="http://www.mamicode.com/${jms.brokerURL}"/>
        <property name="userName" value="http://www.mamicode.com/${jms.userName}"/>
        <property name="password" value="http://www.mamicode.com/${jms.password}"/>
    </bean>

    <bean id="queueName" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0" value="http://www.mamicode.com/${jms.messageTopic}" />
    </bean>

    <bean id="topicName" class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg index="0" value="http://www.mamicode.com/${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这里就会收到消息

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

 

spring整合jms