<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    靈魂-放水

    為學(xué)日益,為道日損。

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      296 Posts :: 10 Stories :: 274 Comments :: 0 Trackbacks
    ??Java 消息服務(wù)(JMS)可以幫助我們減少應(yīng)用程序間的耦合,而同時又允許應(yīng)用程序間的通信以及使用對方的資源。JMS 一般都包含至少三個組成部分:兩個JMS 客戶和一個 JMS 服務(wù)器。兩個客戶通過 JMS 服務(wù)器相互通信。JMS 客戶是使用 JMS API發(fā)送和接收消息的常規(guī)應(yīng)用程序。

    ????JMS 服務(wù)器可以是任何實現(xiàn) JMS 規(guī)范的應(yīng)用程序。一些 JMS 服務(wù)器是更大的應(yīng)用程序的一部分;還有一些是專門負(fù)責(zé) JMS 任務(wù)的應(yīng)用程序。有很多第三方商業(yè)資源和一些開放源代碼資源的 JMS 服務(wù)器可供選擇使用。應(yīng)用程序使用 JMS 相互通信有兩個方法可以選用:JMS 主題和 JMS 隊列。主題和隊列只在很少一些地方有區(qū)別,其中最明顯的區(qū)別是它們發(fā)送消息的方式不同。

    ????JMS 主題從一個 JMS 客戶接收消息然后將這些消息分發(fā)給所有注冊為主題監(jiān)聽者的 JMS 客戶。相反,JMS 隊列只將消息分發(fā)給一個客戶,不管有多少客戶注冊為隊列監(jiān)聽者。如果兩個或者多個客戶注冊到一個隊列,同時一個消息存儲在隊列中,那么只有一個客戶能接收到這個消息。

    ????JMS 規(guī)范沒有規(guī)定哪個客戶將接收這個消息。不管你是使用 JMS 主題還是 JMS 隊列,消息中所要傳遞的數(shù)據(jù)的類型都在于你自己。一些程序員通過他們的消息系統(tǒng)發(fā)送商業(yè)對象,而其它程序員以文本格式發(fā)送 XML 消息從而進一步地減少耦合。如果你以前沒有用過 JMS,那么可能是因為你還沒有一個使用它的原因。如果你以前編寫過你自己的消息系統(tǒng),那么很可能你將從 JMS API 中受益。

    ????JRun服務(wù)器已經(jīng)提供了對JMS的支持,且內(nèi)置了JMS服務(wù),以JRun4.0為例,主要配置文件有{JRun-Home}/server/servers/{server-name}/SERVER-INF/jrun-jms.xml和jrun-resources.xml,查看jrun-jms.xml文件可以知道jrun對于JMS Message的持久化有兩種方式,一個是文件方式,一個是數(shù)據(jù)庫方式,默認(rèn)是文件來保存JMS Message:
    <persistence-manager>???????????
    ?<active-adapter-type>file</active-adapter-type>???????????
    ?<persistence-adapter>?????????????????
    ??<adapter-type>file</adapter-type>???????????
    ?</persistence-adapter>???????????
    ?<persistence-adapter>?????????????????
    ??<adapter-type>rdbm</adapter-type>???????????
    ?</persistence-adapter>?????
    </persistence-manager>

    ?這里需要注意的就是把<client-jndi>的注釋去掉,并修改provider-url為服務(wù)器實際地址,此處為例為192.168.2.240:2908,注意2908是此Server提供的JNDI服務(wù)端口,因為JMS服務(wù)是綁定到server的JNDI服務(wù)上的,客戶端需要查詢JNDI。再修改run-resources.xml添加測試的JMS隊列(也可以通過JRun控制臺添加)

    ?

    <jms-destination>????????????????
    ????
    <jndi-name>jms/queue/testQueue</jndi-name>????????????????????
    ????
    <destination-name>testQueue</destination-name>
    ????
    <destination-type>javax.jms.Queue</destination-type>????
    </jms-destination>

    再添加QueueConnectionFactory

    <jms-connection-factory>
    ????
    <factory-name>QueueConnectionFactory</factory-name>
    ????
    <jndi-name>jms/jndi-QueueConnectionFactory</jndi-name>
    ????
    <type>javax.jms.QueueConnectionFactory</type>
    ????
    <transport>RMI</transport>
    ????
    <username>guest</username>
    ????
    <password>guest</password>
    </jms-connection-factory>

    ?

    上面transport是指傳輸消息所用的協(xié)議,RMI:java遠(yuǎn)程方法調(diào)用,TCP:TCP/IP協(xié)議,Intra-VM:只在本虛擬機傳輸消息,用戶名/密碼是服務(wù)驗證客戶端調(diào)用時使用。服務(wù)器端JMS的設(shè)置基本完成了,還需要設(shè)置jrun的安全策略。

    修改{JRun-Home}/server/security.properties,有兩項jrun.subnet.restriction:子網(wǎng)掩碼,jrun.trusted.hosts:信任主機的IP,否則遠(yuǎn)程調(diào)用可能會被拒絕。再到{JRun-Home}/bin下修改jvm.config,添加java虛擬機啟動參數(shù)-Djava.rmi.server.hostname=192.168.2.240,其中192.168.2.240為主機的實際IP,不要寫localhost,否則RMI的遠(yuǎn)程調(diào)用會被拒絕。也可以寫一個新配置文件new-server.conf,啟動時用命令jrun –config new-server.conf –start XXX指定配置文件。服務(wù)器端的設(shè)置完成。當(dāng)然如果客戶端程序也在此JRun中運行,可以忽略這些參數(shù)的修改和設(shè)置。

    ????客戶端的代碼基本與調(diào)用其他JMS服務(wù)類似。注意要取得{JRun-Home}/lib/jrun.jar并放入到客戶端環(huán)境的classpath中,代碼示例

    ?

    public?class?JmsQueueTest{????????
    ????
    private?Context?context?=?null;????????
    ????
    private?QueueConnection?connection??=?null;????????
    ????
    private?QueueSession?session?=?null;????????
    ????
    private?Queue?queue?=?null;????????
    ????
    private?QueueSender?sender??=?null;????????
    ????
    private?String?connectionFactory;????????
    ????
    private?String?queueJndiName;????????
    ????
    public?void?setConnectionFactory(String?connectionFactory){
    ????????
    this.connectionFactory?=?connectionFactory;
    ????}
    ????????
    ????
    public?void?setQueueJndiName(String?queueJndiName){
    ????????
    this.queueJndiName?=?queueJndiName;????????
    ????}
    ????????
    ????
    /**?????????
    ????*?初始化JMS隊列?????????
    ????*?
    @param?ctxFactory?????????
    ????*?
    @param?url?????????
    ????*?
    @param?user?????????
    ????*?
    @param?pwd?????????
    ????*?
    @throws?Exception?????????
    ????
    */
    ????????
    ????
    public?void?init(String?ctxFactory,String?url,String?user,String?pwd)throws?Exception?{
    ????????Properties?p?
    =?new?Properties();
    ????????p.put(Context.INITIAL_CONTEXT_FACTORY,ctxFactory);
    ????????p.put(Context.PROVIDER_URL,url);
    ????????p.put(Context.SECURITY_PRINCIPAL,user);
    ????????p.put(Context.SECURITY_CREDENTIALS,pwd);
    ????????context?
    =?new?InitialContext(p);
    ????????QueueConnectionFactory?factory?
    =?(QueueConnectionFactory)context.lookup(connectionFactory);
    ????????connection?
    =?factory.createQueueConnection();
    ????????queue?
    =?(Queue)context.lookup(queueJndiName);
    ????????session?
    =?connection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
    ????????sender?
    =?session.createSender(queue);
    ????????connection.start();????????
    ????}
    ????????
    ????
    /**?????????
    ????*?發(fā)送文本消息?????????
    ????*?
    @param?txt?????????
    ????*?
    @throws?Exception?????????
    ????
    */
    ????????
    ????
    public?void?send(String?txt)throws?Exception?{
    ????????TextMessage?tmsg?
    =?session.createTextMessage();????????
    ????????tmsg.setText(txt);?sender.send(tmsg);????????
    ????}
    ????????
    ????
    /**?????????
    ????*?查詢隊列中保存的消息?????????
    ????*?
    @throws?Exception?????????
    ????
    */
    ????????
    ????
    public?void?browser()throws?Exception{
    ????????QueueBrowser?browser?
    =?session.createBrowser(queue);
    ????????Enumeration?
    enum?=?browser.getEnumeration();System.out.println("QueueBrowser");
    ????????
    while?(enum.hasMoreElements()){????????
    ????????????System.out.println(
    enum.nextElement());
    ????????}

    ????????browser.close();????????
    ????}
    ????????
    ????
    /**?????????
    ????*?接收消息?????????
    ????*?
    @throws?Exception?????????
    ????
    */
    ????????
    ????
    public?void?receive()throws?Exception{
    ????????QueueReceiver?receiver?
    =?session.createReceiver(queue);
    ????????
    while(true){
    ????????????TextMessage?message?
    =?(TextMessage)receiver.receiveNoWait();????????
    ????????????
    if(message?==?null)break;????????
    ????????????System.out.println(
    "receive?message:"?+?message.getText());
    ????????}

    ????????receiver.close();????????
    ????}
    ????????
    ????
    public?void?close()throws?Exception{
    ????????sender.close();
    ????????session.close();
    ????????connection.close();
    ????????context.close();????????
    ????}

    ????
    public?static?void?main(String[]?args)throws?Exception?{
    ????????String?ctxFactory?
    =?"jrun.naming.JRunContextFactory";
    ????????String?url?
    =?"192.168.2.240:2908";
    ????????String?user?
    =?"guest";
    ????????String?pwd?
    =?"guest";
    ????????String?connectionFactoryJndi?
    =?"jms/jndi-QueueConnectionFactory";
    ????????String?queueJndi?
    =?"jms/queue/testQueue";
    ????????JmsQueueTest?test?
    =?new?JmsQueueTest();
    ????????test.setConnectionFactory(connectionFactoryJndi);
    ????????test.setQueueJndiName(queueJndi);
    ????????test.init(ctxFactory,url,user,pwd);
    ????????test.send(
    "java共舞JMS消息");
    ????????test.browser();
    ????????test.receive();
    ????????test.close();????????
    ????}


    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1151182

    posted on 2006-09-08 14:29 放水老倌 閱讀(314) 評論(0)  編輯  收藏 所屬分類: J2EE
    主站蜘蛛池模板: 国产亚洲视频在线播放| 最近更新免费中文字幕大全| 亚洲AV成人片色在线观看| 热99re久久精品精品免费| 最近中文字幕mv免费高清在线| 麻豆69堂免费视频| 亚洲 日韩 色 图网站| 久久精品国产亚洲av高清漫画| 国产亚洲精品成人AA片新蒲金| 岛国大片免费在线观看| 亚洲精品在线免费看| 国产在线一区二区综合免费视频| 国产午夜亚洲精品不卡免下载| 亚洲人成电影网站久久| 亚洲综合一区二区| 亚洲一区二区电影| 亚洲AV永久无码区成人网站| 国产亚洲精品a在线观看| 啊灬啊灬别停啊灬用力啊免费看| 日韩免费高清视频网站| 成年性生交大片免费看| 97在线观免费视频观看 | 国产美女做a免费视频软件| 麻豆高清免费国产一区| 日韩免费观看一区| 日本免费高清视频| 免费看男人j放进女人j免费看| 久久www免费人成看国产片| 一级特级aaaa毛片免费观看| 男女交性无遮挡免费视频| 阿v免费在线观看| 日本系列1页亚洲系列| 白白色免费在线视频| 国产精品亚洲一区二区三区在线观看| 亚洲精品无码日韩国产不卡av| 亚洲AV男人的天堂在线观看| 亚洲色偷偷综合亚洲AV伊人蜜桃| 亚洲精品人成网线在线播放va| 亚洲av无码一区二区三区在线播放| 亚洲色成人WWW永久在线观看| 亚洲国产成人无码AV在线|