qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          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ā)送成功:
           4、測(cè)試JMS的PUB/SUB模型
            在實(shí)際測(cè)試時(shí),發(fā)布者和訂閱者并不是需要同時(shí)(異步)出現(xiàn)的。比如有時(shí)我們可能想測(cè)試單位時(shí)間內(nèi)消息發(fā)布者的消息產(chǎn)生量,此時(shí)就不需要消息發(fā)布者,只需要訂閱者就可以了。本例為了說(shuō)明這兩種Sampler的使用,建立兩個(gè)JMeter實(shí)例分別用于發(fā)送和接收消息。
            1)首先新建如下訂閱者的測(cè)試計(jì)劃:
            勾選使用jndi配置文件,并分別輸入jndi中配置的連接工廠和目的地名稱,如上圖所示,點(diǎn)擊運(yùn)行下的啟動(dòng),使用消息消費(fèi)者處于接收狀態(tài)。
            2)然后新建如下發(fā)布者的測(cè)試計(jì)劃:
            勾選使用jndi配置文件,并分別輸入jndi中配置的連接工廠和目的地名稱以及要發(fā)送的消息內(nèi)容,此處為:this is a pubish test,如上圖所示,點(diǎn)擊運(yùn)行下的啟動(dòng),以發(fā)送消息,查看監(jiān)視器元件檢查消息是否發(fā)送成功,如下說(shuō)明發(fā)送成功:
            檢查消息消費(fèi)者是否接收到消息,如下說(shuō)明接收成功:
            上面已完成了JMeter對(duì)JMS的基本測(cè)試演示,實(shí)際測(cè)試時(shí)可能需要根據(jù)實(shí)際的場(chǎng)景選擇合適的取樣器,添加其他測(cè)試元件來(lái)建立和增強(qiáng)測(cè)試計(jì)劃,根據(jù)真實(shí)測(cè)試的中間件拷貝依賴包以及配置jndi以完成JMS應(yīng)用的性能測(cè)試。

          posted on 2014-10-30 10:18 順其自然EVO 閱讀(438) 評(píng)論(0)  編輯  收藏 所屬分類: 測(cè)試學(xué)習(xí)專欄

          <2014年10月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          • 隨筆 - 3936
          • 文章 - 404
          • 評(píng)論 - 179
          • 引用 - 0

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 溧阳市| 盖州市| 广丰县| 南和县| 乳源| 海阳市| 临朐县| 松潘县| 阜宁县| 松滋市| 湾仔区| 准格尔旗| 资阳市| 定州市| 平凉市| 正定县| 娱乐| 马边| 卢龙县| 博湖县| 陇南市| 翼城县| 湾仔区| 东阿县| 长乐市| 乐都县| 乐昌市| 台东市| 宝兴县| 长兴县| 昌吉市| 广南县| 淄博市| 棋牌| 南平市| 鹤峰县| 白银市| 阳谷县| 凭祥市| 年辖:市辖区| 开平市|