1. 程式人生 > >spring整合jms

spring整合jms

tde currency 監聽 temp nec lis catch pub 配置文件

借鑒別人(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這裏就會收到消息

說明:這裏還有一種同步接收消息,就不寫了

spring整合jms