JMS性能測(cè)試方案
JMS綜述
1、相關(guān)概念
1)JMS
jms即Java消息服務(wù)(Java Message Service) 是一個(gè)Java平臺(tái)中關(guān)于面向消息中間件(MOM)的API,用于在兩個(gè)應(yīng)用程序之間,或分布式系統(tǒng)中發(fā)送消息,進(jìn)行異步通信。Java消息服務(wù)是一個(gè)與具體平臺(tái)無(wú)關(guān)的API,絕大多數(shù)MOM提供商都對(duì)JMS提供支持,它提供標(biāo)準(zhǔn)的產(chǎn)生、發(fā)送、接收消息的接口簡(jiǎn)化企業(yè)應(yīng)用的開(kāi)發(fā)。是一組接口和相關(guān)語(yǔ)義的集合,定義了JMS客戶端如何獲取企業(yè)消息產(chǎn)品的功能。JMS并不是一個(gè)MOM。它是一個(gè)API,抽象了客戶端和MOM的交互,就像JDBC抽象與數(shù)據(jù)庫(kù)的交互一樣。
2)MOM
消息中間件MOM的設(shè)計(jì)原理就是作為消息發(fā)送者和接收者的中間人。這個(gè)中間人提供了一個(gè)高級(jí)別的解耦,實(shí)現(xiàn)應(yīng)用間的交互。 在一個(gè)較高級(jí)別看,消息就是一個(gè)商業(yè)信息單元,它通過(guò)MOM從一個(gè)應(yīng)用發(fā)送到另一個(gè)應(yīng)用。應(yīng)用使用目標(biāo)(destinations)來(lái)發(fā)送和接收消息。消息將被投遞到destinations,然后發(fā)送給連接或訂閱該destinations的接收者。這個(gè)機(jī)制能夠解耦消息的發(fā)送者和接收者,因?yàn)樗鼈冊(cè)诎l(fā)送或接收消息的時(shí)候并不需要同時(shí)連接ActiveMQ。發(fā)送者不了解接收者,接收者也不了解發(fā)送者。這個(gè)機(jī)制就叫做異步消息傳送。
3)MQ
MQ全稱為Message Queue, 消息隊(duì)列(MQ)是一種應(yīng)用程序?qū)?yīng)用程序的通信方法。應(yīng)用程序通過(guò)寫和檢索出入列隊(duì)的針對(duì)應(yīng)用程序的數(shù)據(jù)(消息)來(lái)通信,而無(wú)需專用連接來(lái)鏈接它們。消息傳遞指的是程序之間通過(guò)在消息中發(fā)送數(shù)據(jù)進(jìn)行通信,而不是通過(guò)直接調(diào)用彼此來(lái)通信,直接調(diào)用通常是用于諸如遠(yuǎn)程過(guò)程調(diào)用的技術(shù)。排隊(duì)指的是應(yīng)用程序通過(guò)隊(duì)列來(lái)通信。隊(duì)列的使用除去了接收和發(fā)送應(yīng)用程序同時(shí)執(zhí)行的要求。其中較為成熟的MQ產(chǎn)品有IBMWEBSPHERE MQ。
MQ的消費(fèi)-生產(chǎn)者模型的一個(gè)典型的代表,一端往消息隊(duì)列中不斷的寫入消息,而另一端則可以讀取或者訂閱隊(duì)列中的消息。MQ和JMS類似,但不同的是JMS是SUN JAVA消息中間件服務(wù)的一個(gè)標(biāo)準(zhǔn)和API定義,而MQ則是遵循了AMQP協(xié)議的具體實(shí)現(xiàn)和產(chǎn)品。JMS是一個(gè)用于提供消息服務(wù)的技術(shù)規(guī)范,它制定了在整個(gè)消息服務(wù)提供過(guò)程中的所有數(shù)據(jù)結(jié)構(gòu)和交互流程。而MQ則是消息隊(duì)列服務(wù),是面向消息中間件(MOM)的最終實(shí)現(xiàn),是真正的服務(wù)提供者;MQ的實(shí)現(xiàn)可以基于JMS,也可以基于其他規(guī)范或標(biāo)準(zhǔn)。支持JMS的開(kāi)源MQ目前選擇的最多的是ActiveMQ。其他開(kāi)源JMS供應(yīng)商:jbossmq(jboss 4)、jboss messaging (jboss 5)、joram、openjms、mantamq、ubermq、SomnifugiJMS等等。
4)SOAP與JMS
SOAP使用RPC(遠(yuǎn)程過(guò)程調(diào)用)和消息傳遞來(lái)建立通信服務(wù),SOAP RPC定義了用于表示遠(yuǎn)程過(guò)程調(diào)用和應(yīng)答的協(xié)議。SOAP協(xié)議本身僅僅定義了消息的交換結(jié)構(gòu),它可以和許多現(xiàn)存因特網(wǎng)協(xié)議結(jié)合在一起使用,其中包括超文本傳輸協(xié)議( HTTP),多用途網(wǎng)際郵件擴(kuò)充協(xié)議(MIME),Java 消息服務(wù)(JMS)以及簡(jiǎn)單郵件傳輸協(xié)議(SMTP)等。目前與SOAP應(yīng)用最為廣泛的是HTTP協(xié)議和JMS協(xié)議,而與之相對(duì)應(yīng)的兩種應(yīng)用就是SOAP Over HTTP和SOAP Over JMS。
2、JMS體系結(jié)構(gòu)元素
JMS提供者(JMS provider):JMS接口的實(shí)現(xiàn)。
JMS客戶:生產(chǎn)或消費(fèi)基于消息的Java的應(yīng)用程序或?qū)ο蟆?/div>
JMS生產(chǎn)者:創(chuàng)建并發(fā)送消息的JMS客戶。
JMS消費(fèi)者:接收消息的JMS客戶。
JMS消息:包括可以在JMS客戶之間傳遞的數(shù)據(jù)的對(duì)象
JMS隊(duì)列:一個(gè)容納那些被發(fā)送的等待閱讀的消息的區(qū)域。隊(duì)列暗示,這些消息將按照順序發(fā)送。一旦一個(gè)消息被閱讀,該消息將被從隊(duì)列中移走。
JMS主題:一種支持發(fā)送消息給多個(gè)訂閱者的機(jī)制。
JMS提供商:JMS規(guī)范實(shí)現(xiàn)廠商
JMS管理對(duì)象:預(yù)先配置好的用于JMS客戶端的JMS對(duì)象。如:ConnectionFactory--這個(gè)對(duì)象用于客戶端來(lái)創(chuàng)建和提供商的連接,Destination--這個(gè)對(duì)象用于客戶端來(lái)指定發(fā)送消息的目的地(Queue或 Topic),也是接收消息的來(lái)源。被管理對(duì)象被管理員放置在JNDI命名空間。JMS客戶端通常在它的文檔中注上它要求的JMS被管理對(duì)象和這些對(duì)象的JNDI名字應(yīng)當(dāng)如何提供給它。
JMS Domain:JMS定義了兩種域模型,一種是PTP(point-to-point)即點(diǎn)對(duì)點(diǎn)消息傳輸模型,一種是pub/sub(publish-subscribe)即發(fā)布訂閱模型。
3、JMS接口
JMS支持兩種消息類型PTP和Pub/Sub,分別稱作:PTP Domain 和Pub/Sub Domain,這兩種接口都繼承統(tǒng)一的JMS父接口。JMS基于一系列通用的消息概念,每個(gè)JMS消息域—PTP和Pub/Sub—也為這些概念定義了各自的接口集。JMS客戶端程序員使用這些接口來(lái)創(chuàng)建他們的客戶端程序。JMS主要接口如下:
Destination:消息的目的地,封裝了消息目的地標(biāo)識(shí)的被管理對(duì)象。
Session:一個(gè)用于發(fā)送和接收消息的單線程上下文。
MessageProducer(生產(chǎn)者): 由Session對(duì)象創(chuàng)建的用來(lái)發(fā)送消息的對(duì)象。
MessageConsumer(消費(fèi)者):由Session對(duì)象創(chuàng)建的用來(lái)接收消息的對(duì)象。
接口之間的關(guān)系如下:
(JMS應(yīng)用)發(fā)送端的標(biāo)準(zhǔn)流程是:創(chuàng)建連接工廠>創(chuàng)建連接>創(chuàng)建session>創(chuàng)建發(fā)送者>創(chuàng)建消息體>發(fā)送消息到Destination(queue或topic)。
接收端的標(biāo)準(zhǔn)流程是:創(chuàng)建連接工廠>創(chuàng)建連接>創(chuàng)建session>創(chuàng)建接收者>創(chuàng)建消息監(jiān)聽(tīng)器監(jiān)聽(tīng)某Destination的消息>獲取消息并執(zhí)行業(yè)務(wù)邏輯
4、JMS消息
消息是JMS中的一種類型對(duì)象,由兩部分組成:消息頭和消息體(或分三部分:消息頭、屬性、消息體)。消息頭由路由信息以及有關(guān)該消息的元數(shù)據(jù)組成。消息體則攜帶著應(yīng)用程序的數(shù)據(jù)或有效負(fù)載。
1)消息頭(Header):消息頭包含消息的識(shí)別信息和路由信息,標(biāo)準(zhǔn)的JMS消息頭包含以下屬性:
JMSDestination:消息發(fā)送的目的地。
JMSDeliveryMode:傳遞模式,有兩種模式: PERSISTENT和NON_PERSISTENT,PERSISTENT表示該消息一定要被送到目的地,否則會(huì)導(dǎo)致應(yīng)用錯(cuò)誤。NON_PERSISTENT表示偶然丟失該消息是被允許的,這兩種模式使開(kāi)發(fā)者可以在消息傳遞的可靠性和吞吐量之間找到平衡點(diǎn)。標(biāo)記為NON_PERSISTENT的消息最多投遞一次,而標(biāo)記為PERSISTENT的消息將使用暫存后再轉(zhuǎn)送的機(jī)理投遞。如果一個(gè)JMS服務(wù)離線,那么持久性消息不會(huì)丟失但是得等到這個(gè)服務(wù)恢復(fù)聯(lián)機(jī)時(shí)才會(huì)被傳遞。所以默認(rèn)的消息傳遞方式是非持久性的。
JMSExpiration:消息過(guò)期時(shí)間,等于QueueSender的send方法中的timeToLive值或TopicPublisher的publish方法中的timeToLive值加上發(fā)送時(shí)刻的GMT時(shí)間值。如果timeToLive值等于零,則JMSExpiration被設(shè)為零,表示該消息永不過(guò)期。如果發(fā)送后,在消息過(guò)期時(shí)間之后消息還沒(méi)有被發(fā)送到目的地,則該消息被清除。
JMSPriority:消息優(yōu)先級(jí),從0-9 十個(gè)級(jí)別,0-4是普通消息,5-9是加急消息。JMS不要求JMS Provider嚴(yán)格按照這十個(gè)優(yōu)先級(jí)發(fā)送消息,但必須保證加急消息要先于普通消息到達(dá)。
JMSMessageID:唯一識(shí)別每個(gè)消息的標(biāo)識(shí),由JMS Provider產(chǎn)生。
JMSTimestamp:一個(gè)消息被提交給JMS Provider到消息被發(fā)出的時(shí)間。
JMSCorrelationID:用來(lái)連接到另外一個(gè)消息,典型的應(yīng)用是在回復(fù)消息中連接到原消息。
JMSReplyTo:提供本消息回復(fù)消息的目的地址。
JMSType:消息類型的識(shí)別符。
JMSRedelivered:如果一個(gè)客戶端收到一個(gè)設(shè)置了JMSRedelivered屬性的消息,則表示可能該客戶端曾經(jīng)在早些時(shí)候收到過(guò)該消息,但并沒(méi)有簽收(acknowledged)。
除了消息頭中定義好的標(biāo)準(zhǔn)屬性外,JMS提供一種機(jī)制增加新屬性到消息頭中,這種新屬性包含以下幾種:應(yīng)用需要用到的屬性、消息頭中原有的一些可選屬性、JMS Provider需要用到的屬性。
2)消息體:JMS API定義了5種消息體格式,也叫消息類型,你可以使用不同形式發(fā)送接收數(shù)據(jù)并可以兼容現(xiàn)有的消息格式,下面描述這5種類型:
TextMessage:java.lang.String對(duì)象,如xml文件內(nèi)容
MapMessage:名/值對(duì)的集合,名是String對(duì)象,值類型可以是Java任何基本類型
BytesMessage:字節(jié)流
StreamMessage:Java中的輸入輸出流
ObjectMessage:Java中的可序列化對(duì)象
Message:沒(méi)有消息體,只有消息頭和屬性
3)消息可靠性
在上面談及消息體格式定義中,有個(gè)字段JMSDeliveryMode用來(lái)表示該消息發(fā)送后,JMS提供商應(yīng)該怎么處理消息。PERSISTENT(持久化)的消息在JMS服務(wù)器中持久化。接收端如果采用點(diǎn)對(duì)點(diǎn)的queue方式或者Durable Subscription(持久訂閱者)方式,那么消息可保證只且只有一次被成功接收。NON_PERSISTENT(非持久化)的消息在JMS服務(wù)器關(guān)閉或宕機(jī)時(shí),消息丟失。根據(jù)發(fā)送端和接收端采用的方式,列出如下可靠性表格,以作參考。
注意:以下的可靠性不包括JMS服務(wù)器由于資源關(guān)系,造成的消息不能持久化等因素引起的不可靠(該類不可靠應(yīng)該是JMS提供商或硬件引起的的資源和處理能力的極限問(wèn)題,應(yīng)該由管理人員解決)。也不包括消息由于超時(shí)時(shí)間造成的銷毀丟失。
消息發(fā)送端 消息接收端 可靠性及因素
PERSISTENT queue receiver/durable subscriber 消費(fèi)一次且僅消費(fèi)一次。可靠性最好,但是占用服務(wù)器資源比較多。
PERSISTENT non-durable subscriber 最多消費(fèi)一次。這是由于non-durable subscriber決定的,如果消費(fèi)端宕機(jī)或其他問(wèn)題導(dǎo)致與JMS服務(wù)器斷開(kāi)連接,等下次再聯(lián)上JMS服務(wù)器時(shí)消息不保留。
NON_PERSISTENT queue receiver/durable subscriber 最多消費(fèi)一次。這是由于服務(wù)器的宕機(jī)會(huì)造成消息丟失
NON_PERSISTENT non-durable subscriber 最多消費(fèi)一次。這是由于服務(wù)器的宕機(jī)造成消息丟失,也可能是由于non-durable subscriber的性質(zhì)所決定
4)消息的優(yōu)先級(jí)
雖然JMS規(guī)范并不需要JMS供應(yīng)商實(shí)現(xiàn)消息的優(yōu)先級(jí)路線,但是它需要遞送加快的消息優(yōu)先于普通級(jí)別的消息。JMS定義了從0到9的優(yōu)先級(jí)路線級(jí)別,0是最低的優(yōu)先級(jí)而9則是最高的。更特殊的是0到4是正常優(yōu)先級(jí)的變化幅度,而5到9是加快的優(yōu)先級(jí)的變化幅度。舉例來(lái)說(shuō):
topicPublisher.publish (message, DeliveryMode.PERSISTENT, 8, 10000); //Pub-Sub
或 queueSender.send(message,DeliveryMode.PERSISTENT, 8, 10000);//P2P
這個(gè)代碼片斷,有兩種消息模型,映射遞送方式是持久的,優(yōu)先級(jí)為加快型,生存周期是10000 (以毫秒度量)。如果生存周期設(shè)置為零,這則消息將永遠(yuǎn)不會(huì)過(guò)期。當(dāng)消息需要時(shí)間限制否則將使其無(wú)效時(shí),設(shè)置生存周期是有用的。
5)消息的通知確認(rèn)
在客戶端接收了消息之后,JMS服務(wù)怎樣有效確認(rèn)消息是否已經(jīng)被客戶端接收呢?
Session session=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
這段代碼創(chuàng)建一個(gè)非事務(wù)性的session,并采用auto_acknowledge方式通知JMS服務(wù)器。如果采用事務(wù)性session時(shí),通知會(huì)伴隨session的commit/rollback同時(shí)發(fā)送通知。在我們采用非事務(wù)session時(shí),有三種通知方式。
通知方式 效果
DUPS_OK_ACKNOWLEDGE session 延遲通知。如果JMS服務(wù)器宕機(jī),會(huì)造成重復(fù)消息的情況。程序必須保證處理重復(fù)消息而不引起程序邏輯的混亂。
AUTO_ACKNOWLEDGE 當(dāng)receive或MessageListener方法成功返回后自動(dòng)通知。
CLIENT_ACKNOWLEDGE 客戶端調(diào)用消息的acknowledge方法通知
5、PTP模型
點(diǎn)對(duì)點(diǎn)(Point- to-Point)消息傳送使用的目標(biāo)是隊(duì)列。通過(guò)使用隊(duì)列,消息可以被異步或同步地發(fā)送和接收。每一條到達(dá)隊(duì)列的消息將會(huì)被投遞到單獨(dú)一個(gè)消費(fèi)者一次,并且只有一次。這就好像兩個(gè)人之間的郵件發(fā)送。消費(fèi)者可以通過(guò)MessageConsumer.receive()方法同步地接收消息或使用 MessageConsumer.setMessageListener()方法注冊(cè)一個(gè)MessageListener實(shí)現(xiàn)來(lái)異步地接收消息。隊(duì)列保存所有的消息直到它們被投遞出去或過(guò)期。
JMS PTP模型中的主要概念和對(duì)象:
Queue:由JMS Provider管理,隊(duì)列由隊(duì)列名識(shí)別,客戶端可以通過(guò)JNDI接口用隊(duì)列名得到一個(gè)隊(duì)列對(duì)象。
TemporaryQueue:由QueueConnection創(chuàng)建,而且只能由創(chuàng)建它的QueueConnection使用。
QueueConnectionFactory:客戶端用QueueConnectionFactory創(chuàng)建QueueConnection對(duì)象。
QueueConnection:一個(gè)到JMS PTP provider的連接,客戶端可以用QueueConnection創(chuàng)建QueueSession來(lái)發(fā)送和接收消息。
QueueSession:提供一些方法創(chuàng)建QueueReceiver 、QueueSender、QueueBrowser和TemporaryQueue。如果在QueueSession關(guān)閉時(shí),有一些消息已經(jīng)被收到,但還沒(méi)有被簽收(acknowledged),那么,當(dāng)接收者下次連接到相同的隊(duì)列時(shí),這些消息還會(huì)被再次接收。
QueueReceiver:客戶端用QueueReceiver接收隊(duì)列中的消息,如果用戶在QueueReceiver中設(shè)定了消息選擇條件,那么不符合條件的消息會(huì)留在隊(duì)列中,不會(huì)被接收到。
QueueSender:客戶端用QueueSender發(fā)送消息到隊(duì)列。
QueueBrowser:客戶端可以QueueBrowser瀏覽隊(duì)列中的消息,但不會(huì)收走消息。
QueueRequestor:JMS提供QueueRequestor類簡(jiǎn)化消息的收發(fā)過(guò)程。QueueRequestor的構(gòu)造函數(shù)有兩個(gè)參數(shù):QueueSession和queue,QueueRequestor通過(guò)創(chuàng)建一個(gè)臨時(shí)隊(duì)列來(lái)完成最終的收發(fā)消息請(qǐng)求。
可靠性(Reliability):隊(duì)列可以長(zhǎng)久地保存消息直到接收者收到消息。接收者不需要因?yàn)閾?dān)心消息會(huì)丟失而時(shí)刻和隊(duì)列保持激活的連接狀態(tài),充分體現(xiàn)了異步傳輸模式的優(yōu)勢(shì)。
可以看到,一個(gè)或多個(gè)生產(chǎn)者發(fā)送消息,消息m2先抵達(dá)了queue,然后m1也發(fā)出了,并一同存在于一個(gè)先進(jìn)先出的queue里面。消費(fèi)者也存在一個(gè)或多個(gè),對(duì)queue里的消息進(jìn)行消費(fèi)。但一個(gè)消息只會(huì)被的一個(gè)消費(fèi)者消費(fèi)且僅消費(fèi)一次。
6、PUB/SUB模型
JMS Pub/Sub模型定義了如何向一個(gè)內(nèi)容節(jié)點(diǎn)發(fā)布和訂閱消息,這些節(jié)點(diǎn)被稱作主題(topic)。主題可以被認(rèn)為是消息的傳輸中介,發(fā)布者(publisher)發(fā)布消息到主題,訂閱者(subscribe)從主題訂閱消息。主題使得消息訂閱者和消息發(fā)布者保持互相獨(dú)立,不需要接觸即可保證消息的傳送。
JMS Pub/Sub 模型中的主要概念和對(duì)象:
訂閱(subscription):消息訂閱分為非持久訂閱(non-durable subscription)和持久訂閱(durable subscrip-tion),非持久訂閱只有當(dāng)客戶端處于激活狀態(tài),也就是和JMS Provider保持連接狀態(tài)才能收到發(fā)送到某個(gè)主題的消息,而當(dāng)客戶端處于離線狀態(tài),這個(gè)時(shí)間段發(fā)到主題的消息將會(huì)丟失,永遠(yuǎn)不會(huì)收到。持久訂閱時(shí),客戶端向JMS注冊(cè)一個(gè)識(shí)別自己身份的ID,當(dāng)這個(gè)客戶端處于離線時(shí),JMS Provider會(huì)為這個(gè)ID保存所有發(fā)送到主題的消息,當(dāng)客戶再次連接到JMS Provider時(shí),會(huì)根據(jù)自己的ID得到所有當(dāng)自己處于離線時(shí)發(fā)送到主題的消息。
Topic:主題由JMS Provider管理,主題由主題名識(shí)別,客戶端可以通過(guò)JNDI接口用主題名得到一個(gè)主題對(duì)象。JMS沒(méi)有給出主題的組織和層次結(jié)構(gòu)的定義,由JMS Provider自己定義。
TemporaryTopic:臨時(shí)主題由TopicConnection創(chuàng)建,而且只能由創(chuàng)建它的TopicConnection使用。臨時(shí)主題不能提供持久訂閱功能。
TopicConnectionFactory:客戶端用TopicConnectionFactory創(chuàng)建TopicConnection對(duì)象。
TopicConnection:TopicConnection是一個(gè)到JMS Pub/Sub provider的連接,客戶端可以用TopicConnection創(chuàng)建TopicSession來(lái)發(fā)布和訂閱消息。
TopicSession:TopicSession提供一些方法創(chuàng)建TopicPublisher、TopicSubscriber、TemporaryTopic 。它還提供unsubscribe方法取消消息的持久訂閱。
TopicPublisher:客戶端用TopicPublisher發(fā)布消息到主題。
TopicSubscriber:客戶端用TopicSubscriber接收發(fā)布到主題上的消息。可以在TopicSubscriber中設(shè)置消息過(guò)濾功能,這樣,不符合要求的消息不會(huì)被接收。
Durable TopicSubscriber:如果一個(gè)客戶端需要持久訂閱消息,可以使用Durable TopicSubscriber,TopSession提供一個(gè)方法createDurableSubscriber創(chuàng)建Durable TopicSubscriber對(duì)象。
恢復(fù)和重新派送(Recovery and Redelivery):非持久訂閱狀態(tài)下,不能恢復(fù)或重新派送一個(gè)未簽收的消息。只有持久訂閱才能恢復(fù)或重新派送一個(gè)未簽收的消息。
TopicRequestor:JMS提供TopicRequestor類簡(jiǎn)化消息的收發(fā)過(guò)程。TopicRequestor的構(gòu)造函數(shù)有兩個(gè)參數(shù):TopicSession和topic。TopicRequestor通過(guò)創(chuàng)建一個(gè)臨時(shí)主題來(lái)完成最終的發(fā)布和接收消息請(qǐng)求。
可靠性(Reliability):當(dāng)所有的消息必須被接收,則用持久訂閱模式。當(dāng)丟失消息能夠被容忍,則用非持久訂閱模式。
在pub/sub消息模型中,消息被廣播給所有訂閱者。訂閱者可以同步接收消息也可以異步接收消息,消息的同步接收是指客戶端主動(dòng)去接收消息,消息的異步接收是指當(dāng)消息到達(dá)時(shí),主動(dòng)通知客戶端。
使用JMeter測(cè)試JMS
JMeter是Apache開(kāi)發(fā)的一款小巧易用的開(kāi)源性能測(cè)試工具,由java語(yǔ)言開(kāi)發(fā)。JMeter不僅免費(fèi)開(kāi)源而且功能強(qiáng)大、易于擴(kuò)展,如果有一定Java開(kāi)發(fā)基礎(chǔ)的話還可以在JMeter上做擴(kuò)展開(kāi)發(fā)新的插件等,幾乎能滿足各種性能測(cè)試需求。JMeter中使用Sampler元件(取樣器)來(lái)模擬各種的類型的請(qǐng)求數(shù)據(jù)格式,類似于LR中的協(xié)議(比LR中的協(xié)議概念更廣),如:http、ftp、soap、tcp等等。JMeter中支持的JMS Point-to Point、JMS Publisher和JMS Subscriber分別用于發(fā)送JMS的PTP消息和PUB/SUB消息,因此可以選擇使用JMeter來(lái)測(cè)試JMS。
MOM(消息中間件)作為消息數(shù)據(jù)交換的平臺(tái),也是影響應(yīng)用執(zhí)行效率的潛在環(huán)節(jié)。在Java程序中,是通過(guò)JMS與MOM進(jìn)行交互的。作為Java實(shí)現(xiàn)的性能測(cè)試工具JMeter也能使用JMS對(duì)應(yīng)用的消息交換和相關(guān)的數(shù)據(jù)處理能力進(jìn)行測(cè)試。在整個(gè)測(cè)試過(guò)程中,JMeter測(cè)試的重點(diǎn)是消息的產(chǎn)生者和消費(fèi)者的能力,而不是MOM本身。JMeter雖然能使用JMS對(duì)MOM進(jìn)行測(cè)試,但是它本身并沒(méi)有提供JMS需要使用的包(實(shí)現(xiàn)類)。因此在使用JMeter測(cè)試JMS時(shí)需要使用到具體的MOM的相關(guān)jar包。以下結(jié)合流行的開(kāi)源消息中間件ActiveMQ來(lái)演示如何使用JMeter來(lái)實(shí)現(xiàn)對(duì)JMS的測(cè)試。
1、安裝并啟動(dòng)ActiveMQ服務(wù)
2、測(cè)試前的準(zhǔn)備
使用JMeter進(jìn)行壓力測(cè)試時(shí),所有的JMeter依賴的包需要復(fù)制到%JMETER_HOME%/lib目錄下。對(duì)于ActiveMQ來(lái)說(shuō),就是復(fù)制%ACTIVEMQ_HOME%/lib目錄下jar包,可根據(jù)實(shí)際情況來(lái)考慮是否復(fù)制。JMeter在測(cè)試時(shí)使用了JNDI,為了提供JNDI提供者的信息,需要提供jndi.properties。同時(shí)需要將jndi.properties放到JMeter的%JMETER_HOME%/lib和%JMETER_HOME%/bin目錄中,還需要將jndi.properties與%JMETER_HOME%/bin目錄下的ApacheJMeter.jar打包在一起。對(duì)于ActiveMQ,jndi.properties的演示內(nèi)容如下:
1 #java.naming.factory.initial = org.activemq.jndi.ActiveMQInitialContextFactory 2 java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory 3 java.naming.provider.url = tcp://localhost:61616 4 5 #指定connectionFactory的jndi名字,多個(gè)名字之間可以逗號(hào)分隔。 6 #以下為例: 7 #對(duì)于topic,使用(TopicConnectionFactory)context.lookup("connectionFactry") 8 #對(duì)于queue,(QueueConnectionFactory)context.lookup("connectionFactory") 9 connectionFactoryNames = connectionFactory 10 11 #注冊(cè)queue,格式: 12 #queue.[jndiName] = [physicalName] 13 #使用時(shí):(Queue)context.lookup("jndiName"),此處是MyQueue 14 queue.MyQueue = example.MyQueue 15 16 #注冊(cè)topic,格式: 17 # topic.[jndiName] = [physicalName] 18 #使用時(shí):(Topic)context.lookup("jndiName"),此處是MyTopic 19 topic.MyTopic = example.MyTopic |
3、測(cè)試JMS的PTP模型
對(duì)于點(diǎn)對(duì)點(diǎn)模型,JMeter只提供了一種Sampler:JMS Point-to-Point。如圖所示建立測(cè)試計(jì)劃:
QueueConnection Factory:連接工廠,輸入jndi配置文件中配置的connectionFactory
JNDI name Request queue:請(qǐng)求隊(duì)列名,輸入jndi配置文件中配置的MyQueue
JNDI name Receive queue:接收隊(duì)列名,輸入jndi配置文件中配置的MyQueue
Content:消息內(nèi)容,比如輸入:this is a test
Initial Context Factory:輸入org.apache.activemq.jndi.ActiveMQInitialContextFactory
Provider URL:提供者URL,即安裝的ActiveMQ的服務(wù)地址tcp://yourIP:61616
運(yùn)行調(diào)試時(shí)通過(guò)監(jiān)視器元件查看是否發(fā)送成功,如下說(shuō)明發(fā)送成功:
posted on 2014-10-30 10:18 順其自然EVO 閱讀(438) 評(píng)論(0) 編輯 收藏 所屬分類: 測(cè)試學(xué)習(xí)專欄
只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
|
||
相關(guān)文章:
|
||