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使用一種特殊的輪詢機制不斷從伺服器獲取訊息處理的響應.