1. 程式人生 > >ActiveMQ結合WebScoket應用例子以及介紹

ActiveMQ結合WebScoket應用例子以及介紹

rpc clu ges ner 異步消息 接口 協議 system jvm

一、ActiveMQ的介紹?

1.JMS基礎概念

JMS(java Message Service) 即使java消息服務,它提供標準的產生、發送、接收的接口簡化企業應用開發,它支持兩種消息通信模型:點到點(point-to-point)(P2P) 模型和發布/訂閱模型。P2P模型規定了一個消息只能有一個接受者,Pub/Sub 模型允許一個消息可以有多個接受者。

對於點到點模型,消息生產者產生一個消息後,把這個消息發送到一個Queue(隊列)

中,然後消息接收者再從這個Queue中讀取數據,一旦消息被接受者讀取之後,他就在Queue中消失了,所以一個消息只能被一個接受者消費。

與點到點模型不同,發布/訂閱模型中,消息生產者產生一個消息後把這個消息發送到一個Topic中,這個Topic可以同時有多個接受者在監聽,當一個消息到達這個Topic之後,所有消息接受者都會收到這個消息。

2.編程的結構

2.1消息產生者向JMS發送消息步驟如下

(1)創建連接使用的工廠類JMS ConnectionFactory

(2)使用管理對象JMS ConnectionFactory建立連接Connection

(3)使用連接Connection建立會話Session

(4)使用會話Session和管理對象Destination 創建消息生產者MessageSender

(5)使用消息生產者MessageSender發送消息

2.2消息消費者從JMS接收消息的步驟如下

(1)創建連接使用的工廠類JMS ConnectionFactory

(2)使用管理對象JMS ConnectionFactory建立連接Connection

(3)使用連接建立會話Session

(4)使用會話Session和管理對象Destination創建消息消費者MessageReceiver

(5)使用消息消費者MessageReceiver接受消息,需要用setMessageListener將MessageListener接口綁定到MessageReceiver

消息消費者必須實現了MessageListener接口,需要定於onMessage時間方法。

3.ActiveMQ的下載地址:

下載地址:http://activemq.apache.org/download.html

下載到本地的目錄結構為:

技術分享

進入bin目錄下

技術分享

根據自己的系統位數來執行目錄下的

技術分享

雙擊讓他跑起來,效果如下

技術分享

二、ActiveMQ能幹嘛,好處是什麽

activemq有自己的特點和優勢:

(1)activemq可以很好的運行在任何JVM上,而不只是集成到JBoss的應用服務器中;

(2)activemq支持大量的跨語言客戶端;

(3)activemq支持許多不同的協議,如Ajax,REST,Stomp,OpenWire,XMPP

(4)activemq支持許多高級功能,例如MessageGroups,ExclusiveConsumer,CompositeDestinations

(5)AdvisoryMessage

(6)activemq支持可靠連接並且具有可配置的自動重連接

(7)activemq對spring有很好的支持

(8)activemq支持跨網絡的分布式目的地

(9)activemq是速度非常快;一般要比jbossmq快10倍

三、ActiveMQ一般應用到什麽場景

ActiveMQ 使用場景

1.非均勻應用集成

ActiveMQ 中間件用Java語言編寫,因此自然提供Java客戶端 API。但是ActiveMQ 也為C/C++、.NET、Perl、PHP、Python、Ruby 和一些其它語言提供客戶端。在你考慮如何集成不同平臺不同語言編寫應用的時候,ActiveMQ 擁有巨大優勢。在這樣的例子中,多種客戶端API通過ActiveMQ 發送和接受消息成為可能,無論使用的是什麽語言。此外,ActiveMQ 還提供交叉語言功能,該功能整合這種功能,無需使用遠程過程調用(RPC)確實是個優勢,因為消息協助應用解耦。

2.作為RPC的替代

應用使用RPC分格同步調用十分普遍。假設大多數客戶端服務器應用使用RPC,包括ATM、大多數WEB應用、信用卡系統、銷售點系統等等。盡管很多系統很成功,轉換使用異步消息可以帶來很多好處,而且也不會放棄響應保證。系統依賴同步需求典型地限制了擴展,因為最終需求將開始起作用,從而放慢整個系統。取而代之這種不好的體驗,使用異步消息,附加的消息接收器可以輕松添加,假設你的應用可以解耦。

3.兩個應用之間解耦

正如之前討論的,緊耦合架構可以導致很多問題,尤其是如果他們是分布的。松耦合架構,在另一方面,證實了更少的依賴性,能夠更好地處理不可預見的改變。你不見可以在系統中改變組件而不影響整個系統,而且組件交互也相當的簡單。取代使用同步方案的組件交互,組件利用異步通信。這樣的松耦合遍及系統被稱之為事件驅動架構(EDA)。

4.作為事件驅動架構的主幹

在之前的觀點中,解耦、異步風格架構允許軟件本身進一步擴展(水平的可擴展性),而不是依賴硬件的可擴展性(垂直的可擴展)。想象一下一種難以置信的流量、電子商務網站像亞馬遜。但一個用戶在亞馬遜上購買,有許多分開的階段貫穿,訂單需要履行包括訂單配置、創建發票、支付流程、訂單完成、運輸等。然而,但一個用戶實際上提交了一個訂單,用戶立即得到一個頁面說明,“感謝您的訂單”不僅如此,沒有任何延遲。用戶也收到了訂單已經收到的郵件說明,訂單配置流程由亞馬遜雇傭就是個很好的例子,第一步在一種更大的、異步流程中。每一個訂單步驟直接由分開的服務奮力地處理。但用戶下了訂單,異步調用提交訂單,但是全部訂單流程不會落後於通過網頁瀏覽器進行的同步調用。反之,訂單被接受並立即被確認。這個流程中剩余的步驟一步地被處理。如果發生了問題。組織流程進行,用戶會被通知。這樣的異步流程提供大量的可擴展性。

5.改善應用可擴展性

許多應用利用事件驅動架構,為了提供大量的可擴展性,包括像電子商務、政府、制造業和在線遊戲等領域。使用異步消息在業務領域分離一個應用,許多其它可能性開始合並。考慮使用服務為特定任務設計應用的能力。這正是面向服務架構(SOA)的主幹。每一個服務實現一個獨立的功能,而且只是那個功能。應用通過這些服務構成來創建,在服務間使用異步消息實現通信。這種風格的應用設計被稱之為復雜事件處理(CEP)。使用CEP,系統中組件之間的交互可以被進一步的分析跟蹤。在考慮異步消息在系統的組件之間添加一種迂回的時候,這些可能性是無止境的。

四、連接使用案例

生產者:

package com.xuwei.activemq;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.DeliveryMode;

import javax.jms.Destination;

import javax.jms.MessageProducer;

import javax.jms.Session;

import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;

import org.apache.activemq.ActiveMQConnectionFactory;

public class Sender {

private static final int SEND_NUMBER = 5;

public static void main(String[] args) {

// ConnectionFactory :連接工廠,JMS 用它創建連接

ConnectionFactory connectionFactory;

// Connection :JMS 客戶端到JMS Provider 的連接

Connection connection = null;

// Session: 一個發送或接收消息的線程

Session session;

// Destination :消息的目的地;消息發送給誰.

Destination destination;

// MessageProducer:消息發送者

MessageProducer producer;

// TextMessage message;

// 構造ConnectionFactory實例對象,此處采用ActiveMq的實現jar

connectionFactory = new ActiveMQConnectionFactory(

ActiveMQConnection.DEFAULT_USER,

ActiveMQConnection.DEFAULT_PASSWORD,

"tcp://localhost:61616");

try {

// 構造從工廠得到連接對象

connection = connectionFactory.createConnection();

// 啟動

connection.start();

// 獲取操作連接

session = connection.createSession(Boolean.TRUE,

Session.AUTO_ACKNOWLEDGE);

// 獲取session註意參數值xingbo.xu-queue是一個服務器的queue,須在在ActiveMq的console配置

destination = session.createQueue("FileQueue");

// 得到消息生成者【發送者】

producer = session.createProducer(destination);

// 設置不持久化,此處學習,實際根據項目決定

producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

// 構造消息,此處寫死,項目就是參數,或者方法獲取

sendMessage(session, producer);

session.commit();

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (null != connection)

connection.close();

} catch (Throwable ignore) {

}

}

}

public static void sendMessage(Session session, MessageProducer producer)

throws Exception {

for (int i = 1; i <= SEND_NUMBER; i++) {

TextMessage message = session

.createTextMessage("ActiveMq 發送的消息" + i);

// 發送消息到目的地方

System.out.println("發送消息:" + "ActiveMq 發送的消息" + i);

producer.send(message);

}

}

}

可以看到ActiveMQ以成功的向FileQueue隊列發送了五條數據

技術分享

Web端使用websocket連接ActiveMQ:

需要導入:stop.js

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<script type="text/javascript" src="stomp.js"></script>

</head>

<body>

<script type="text/javascript">

var url = "ws://localhost:61614/stomp";

var login = "admin";

var passcode = "admin";

//監聽的隊列

//需要和發送者的發送的隊列名稱一致否則無法接受到數據

destination = "FileQueue";

client = Stomp.client(url);

var onconnect = function(frame) {

client.subscribe(destination, function(message) {

console.log(message.body);

alert(message.body);

});

};

client.connect(login, passcode, onconnect);

</script>

</body>

</html>

效果如下:

技術分享

ActiveMQ結合WebScoket應用例子以及介紹