利用activemq實現jms的開發(實戰篇)

講完了理論,接下來是實戰部分,還但願大牛們可以指出不足之處java

要使用Java消息服務,你必需要有一個JMS提供者,管理會話和隊列。既有開源的提供者也有專有的提供者。web

開源的提供者包括:ajax

Apache ActiveMQspring

JBoss 社區所研發的 HornetQapache

Joramapi

Coridan的MantaRay瀏覽器

The OpenJMS Group的OpenJMS服務器

而我選擇的是在網上人氣最高的ActiveMQ~~app

關於ActiveMQ的安裝和配置我這裏就不作多餘陳述,網上關於這個的資料不少,咱們直接來啓動ActiveMQ就行了~異步

ActiveMQ默認啓動時,啓動了內置的jetty服務器,提供一個用於監控ActiveMQ的admin應用。
咱們來經過瀏覽器訪問admin:http://127.0.0.1:8161/admin/

用戶名和密碼默認都是admin,這是登陸之後的頁面:

image

至此,咱們的activemq就已經完成了準備階段工做,能夠開始進行開發了~~

我簡單說明一下個人開發環境,我是使用maven構建項目,用spring對activemq進行了集成

開發階段:

1.首先是在pom.xml中引入對activemq的支持,代碼以下

<!-- jms的activemq實現 -->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
            <version>5.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-web</artifactId>
            <version>5.8.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
            <version>5.13.2</version>
        </dependency>

這裏有一點須要注意,我在引入activemq依賴的時候出的兩個問題,第一個是以後若是涉及到異步接收消息,咱們要注意使用servlet3.0以後的版本,另外一個問題是activemq5.6是會多引入例如servlet和jsp的依賴,這個時候要注意排除和你以前的servlet,jsp排除衝突

2.在spring中配置activemq

首先,咱們在根目錄下新建一個jms.properties

這個是個人內容:

jms.brokerURL      = tcp://localhost:61616
jms.userName       = admin
jms.password       = admin
jms.messageTopic        =messageTopic

接下來開始經過spring容器初始化配置,如下是配置文件

<!-- jms -->
    <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="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
        destroy-method="stop">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="maxConnections" value="100"></property>
    </bean>
     
    <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"> 
        <constructor-arg index="0" value="${jms.messageTopic}" /> 
    </bean> 
        <bean id="destinationTopic" 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="jmsFactory" /> 
        <property name="defaultDestination" ref="destination"/> 
    </bean> 
   
    <!-- jms的發送者 -->
    <bean id="activemqMessageSender" class="com.code.cheney.ssm_Maven.jms.impl.ActivemqMessageSender"> 
        <constructor-arg index="0" ref="jmsTemplate"/> 
    </bean>
   
    <!-- jms的接收者 -->
    <bean id="activemqMessageReceiver" class="com.code.cheney.ssm_Maven.jms.impl.ActivemqMessageReceiver"> 
        <constructor-arg index="0" ref="jmsTemplate"/> 
    </bean>
   
    <!-- 調用純jms api時的異步操做 -->
   
    <jms:listener-container container-type="default" 
        connection-factory="connectionFactory" acknowledge="auto" concurrency="10"> 
        <jms:listener destination="${jms.messageTopic}" ref="messageListener" 
            method="onMessage" /> 
    </jms:listener-container> 
   
    <!-- jms執行異步操做時的監聽器 -->
    <bean id="activemqMessageListener" class="com.code.cheney.ssm_Maven.jms.impl.ActivemqMessageListener"/>

3.編寫jms的發送類,接收類,監聽器

package com.code.cheney.ssm_Maven.jms.impl;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

import com.code.cheney.ssm_Maven.jms.MessageSender;

/**  
*   
* Project: ssm_jms  
* Class: ActivemqMessageSender  
* Description:
* @author: Cheney  
* @Date 2016年5月2日 下午12:00:09
* @version 1.0
*   
*/
@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);
    }

}

 

package com.code.cheney.ssm_Maven.jms.impl;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

import com.code.cheney.ssm_Maven.jms.MessageReceiver;

/**
*
* Project: ssm_jms Class: ActivemqMessageReceiver Description:
*
* @author: Cheney
* @Date 2016年5月2日 下午1:42:45
* @version 1.0
*
*/
@Component
public class ActivemqMessageReceiver implements MessageReceiver {

    private JmsTemplate jmsTemplate;

    public ActivemqMessageReceiver(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    @Override
    public String receiveMessage() {
        String result = (String) jmsTemplate.receiveAndConvert();
        return result;
    }

}

 

package com.code.cheney.ssm_Maven.jms.impl;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.springframework.stereotype.Component;

/**  
*   
* Project: ssm_jms  
* Class: ActivemqMessageListener  
* Description:
* @author: Cheney  
* @Date 2016年5月2日 下午1:48:07
* @version 1.0
*   
*/
@Component
public class ActivemqMessageListener implements MessageListener { 
     
    @Override 
    public void onMessage(Message msg) { 
        TextMessage textMsg = (TextMessage)msg; 
        try { 
            String message = textMsg.getText(); 
            System.out.println(message); 
        } catch (JMSException e) { 
            e.printStackTrace(); 
        } 
    }

代碼中MessageReceiver 和MessageSender這兩個是我本身定義的接口其中只包括對應的接收消息和發送消息的兩個方法。

接下來就是調用發送類的sendMessage方法發送消息和調用接收類的receiveMessage方法來接收消息啦~
以上就是一個最簡單的利用spring集成activemq進行jms開發的例子,固然還有一個更方便的ajax方式,由於在原理上都是相同的,因此不想說太多了,簡單說一下區別就是在web.xml多瞭如下配置

<!-- JMS的ajax實現 -->
    <servlet>
        <servlet-name>AjaxServlet</servlet-name>
        <servlet-class>org.apache.activemq.web.AjaxServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>AjaxServlet</servlet-name>
        <url-pattern>/amq/*</url-pattern>
    </servlet-mapping>
   
    <!-- 啓動時servlet將鏈接tcp://127.0.0.1:61616 -->   
    <context-param>
        <param-name>org.apache.activemq.brokerURL</param-name>
        <param-value>tcp://127.0.0.1:61616</param-value>
    </context-param>
   
    <!-- 不須要啓用一個嵌入式代理 -->
    <context-param>
        <param-name>org.apache.activemq.embeddedBroker</param-name>
        <param-value>false</param-value>
    </context-param>

哦對了,我在開發過程當中還遇到的一個問題是忘記在web.xml設置全部的過濾器、攔截器以及servlet爲異步模式,只要在每個配置中間加一句

<async-supported>true</async-supported>

就大功告成了~~

以上就是最簡單的jms開發,更多的內容要本身去官網看文檔咯~

相關文章
相關標籤/搜索