1. 程式人生 > >ActiveMQ + AJAX 實現web端收發訊息

ActiveMQ + AJAX 實現web端收發訊息

ActiveMQ支援Ajax,可以利用ActiveMQ的訊息佇列,來建立高度實時的web應用,例如實現web即時通訊。
Apache-activemq的目錄下有一個官方的例子,webapps-demo . 官方的說明在這 http://activemq.apache.org/ajax.html

1.新建maven工程,引入依賴

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId
>
<version>1.5.3.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-client</artifactId> <version>5.8.0</version> </dependency> <dependency
>
<groupId>org.apache.activemq</groupId> <artifactId>activemq-web</artifactId> <version>5.8.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId
>
</dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>4.3.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.3.6</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> </dependencies>

專案結構如下

這裡寫圖片描述

2.配置servlet
注意要在servletContext中設定”org.apache.activemq.brokerURL”,這是ActiveMQ broker的地址, 我這裡是本地的, “tcp://127.0.0.1:61616”

@Configuration
public class ServletBean {


    @Bean
    public ServletRegistrationBean amqServletRegistrationBean() {
        ServletRegistrationBean registrationBean = new ServletRegistrationBean();
        registrationBean.setServlet(new AjaxServlet());
        registrationBean.setLoadOnStartup(1);
        List<String> urlMappings=new ArrayList<String>();
        urlMappings.add("/amq/*");
        registrationBean.setUrlMappings(urlMappings);
        return registrationBean;
    }

    @Bean
    public ServletContextInitializer initializer() {
        return new ServletContextInitializer() {
            @Override
            public void onStartup(ServletContext servletContext) throws ServletException {
                servletContext.setInitParameter("org.apache.activemq.brokerURL", "tcp://127.0.0.1:61616");
            }
        };
    }
}

3.web

先在 ActiveMQ的目錄下 webapps-demo/demo/js 找到三個js 檔案

query-1.4.2.min.js
amq_jquery_adapter.js
js/amq.js

放入Spring Boot專案中 resource/static/js

然後建立兩個頁面,一個傳送,一個接收, 具體見專案原始碼

測試一下收發訊息,如下圖

傳送訊息

傳送訊息

接收訊息

這裡寫圖片描述

5.原理說明
ActiveMQ 在版本釋出包中包含了web sample的demo,其中就包含js與ActiveMQ互動的庫檔案amq.js.
以5.8.0版本為例,該檔案目錄為
apache-activemq-5.8.0\webapps-demo\demo\js\amq.js這個js檔案還依賴一些基於公共JavaScript框架的
介面卡檔案,比如依賴jQuery的介面卡為amq_jquery_adapter.js. 因此,使用amq.js時,必須先引入
jquery庫檔案和介面卡庫檔案amq_jquery_adapter.js,然後在引入amq.js.

amq.js裡面提供了sendMessage方法可以傳送訊息到代理,而addListener和removeListener方法可以給
指定的的訊息目的地新增或刪除監聽器,新增監聽器後即可接收訊息了.

在web頁面使用sendMessage傳送訊息,其實是向後臺的一個servlet傳送請求,然後由該servlet傳送訊息給代理.
這個servlet的類由ActiveMQ提供(後面配置web.xml時介紹)

頁面呼叫addListener註冊監聽器,其實也是傳送請求給servlet,由servlet建立一個目的地的消費者,當該目的地
有訊息時,servlet處理訊息,並將訊息處理響應傳送給客戶端.因為採用web的CS架構,servlet不能直接將響應傳送
給客戶端. 這裡amq.js中其實是採用了一種頁面輪詢的方式向伺服器請求訊息,以便監聽代理上指定的目的地.

簡而言之就是,
傳送訊息: amq.js使用sendMessage傳送訊息給servlet,servlet在將訊息發給代理.
接收訊息: amq.js使用addListener註冊監聽器接收並處理訊息,其實也是傳送請求給servlet,servlet產生訊息消費者
消費指定目的地的訊息併產生客戶端響應,amq.js使用一種特殊的輪詢機制不斷從伺服器獲取訊息處理的響應.