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

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

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

    細(xì)心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點(diǎn)粗墨,七八筆買賣,九十道人情。

    BlogJava 聯(lián)系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks

    JMS服務(wù)器openJms入門

    首先可以到網(wǎng)站上下載最新的openjms版本,然后啟動(dòng)bin下的startup.bat就啟動(dòng)服務(wù)了,然后可以啟動(dòng)admin.bat進(jìn)入管理界面(非必要步驟),然后分別運(yùn)行samples下的basic例子就可以看到效果了,當(dāng)然以前有篇文章介紹的不錯(cuò),可以參考一下,不過時(shí)間上比較老了,做為參考還是可以的。

    JMS 有五種消息類型。三種結(jié)構(gòu)化或半結(jié)構(gòu)化的消息類型(MapMessage、ObjectMessage 和 StreamMessage)以及兩種非結(jié)構(gòu)化的或自由格式的消息類型(TextMessage 和 BytesMessage)。而這里雖然我們只對(duì)非結(jié)構(gòu)化消息進(jìn)行說明,但非結(jié)構(gòu)化的消息格式卻能夠更好地進(jìn)行交互操作,因?yàn)樗鼈冊(cè)谙⑸虾苌倮媒Y(jié)構(gòu),在此基礎(chǔ)上與XML再進(jìn)行結(jié)合,將能方便的進(jìn)行更好的擴(kuò)展,XML相關(guān)簡(jiǎn)化操作參考《Jaxb來實(shí)現(xiàn)Java-XML的轉(zhuǎn)換》。

    下面具體來介紹服務(wù)器搭建,在http://openjms.sourceforge.net/downloads.html下載openJms,解壓后可以直接使用,在 \openjms-0.7.6.1\bin 里,有openJms的運(yùn)行腳本,執(zhí)行 startup 啟動(dòng),彈出一個(gè)新的窗口,服務(wù)就運(yùn)行在新窗口內(nèi),shutdown 為停止命令:

    服務(wù)運(yùn)行后,就可以開始使用JMS服務(wù)了,至此服務(wù)搭建完畢,簡(jiǎn)單得不能再簡(jiǎn)單了。

    下面是消息發(fā)送和接收的開發(fā),開發(fā)中需要的jar包在\openjms-0.7.6.1\lib里可以找到:
    openjms-0.7.6.1.jar
    jms-1.0.2a.jar
    exolabcore-0.3.7.jar
    commons-logging-1.0.3.jar

    把上面的類包加入到項(xiàng)目中,下面是消息發(fā)送服務(wù)的代碼:

    package javayou.demo.openjms;
    import java.util.*;
    import javax.jms.*;
    import javax.naming.*;

    public class QueueSend {
        public static void main(String[] args) {
            try {
                //取得JNDI上下文和連接
                Hashtable properties = new Hashtable();
                properties.put(
                    Context.INITIAL_CONTEXT_FACTORY,
                    "org.exolab.jms.jndi.InitialContextFactory");
                //openJms默認(rèn)的端口是1099
                properties.put(Context.PROVIDER_URL,
                     "rmi://localhost:1099/");
                Context context = new InitialContext(properties);

                //獲得JMS信息連接隊(duì)列工廠
                QueueConnectionFactory queueConnectionFactory =
                    (QueueConnectionFactory) context.lookup(
                        "JmsQueueConnectionFactory");
                //獲得JMS信息連接隊(duì)列
                QueueConnection queueConnection =
                    queueConnectionFactory.createQueueConnection();
                //產(chǎn)生隊(duì)列Session,設(shè)置事務(wù)為false,自動(dòng)應(yīng)答消息接收
                QueueSession queueSession =
                    queueConnection.createQueueSession(
                        false,
                        Session.AUTO_ACKNOWLEDGE);

                //獲得默認(rèn)內(nèi)建在JMS里的隊(duì)列之一:queue1
                Queue queue = (Queue) context.lookup("queue1");
                //產(chǎn)生JMS隊(duì)列發(fā)送器
                QueueSender queueSender =
                    queueSession.createSender(queue);
                //發(fā)送數(shù)據(jù)到JMS
                TextMessage message = queueSession.createTextMessage();
                message.setText("Hello, I'm openJms.");
                queueSender.send(message);

                System.out.println(
                    ""信息寫入JMS服務(wù)器隊(duì)列");

                //以下做清除工作,代碼略
                // ... ...
                          
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    執(zhí)行程序發(fā)送消息,然后打開JMS控制臺(tái),用 admin 命令啟動(dòng)管理平臺(tái),點(diǎn)擊菜單Actions-Connections-online,出現(xiàn)界面如下:

    可以看到JSM默認(rèn)的隊(duì)列queue1里已經(jīng)有1條消息了,而其他的隊(duì)列還是空著的。

    下面我們來看看消息接收服務(wù)的代碼:

    package javayou.demo.openjms;
    import java.util.*;
    import javax.jms.*;
    import javax.naming.*;
    public class QueueReceiveSynchronous {
        public static void main(String[] args) {
            try {
                //取得JNDI上下文和連接
                Hashtable properties = new Hashtable();
                properties.put(
                    Context.INITIAL_CONTEXT_FACTORY,
                    "org.exolab.jms.jndi.InitialContextFactory");
                properties.put(Context.PROVIDER_URL,
                    "rmi://localhost:1099/");
                Context context = new InitialContext(properties);

                //獲得JMS信息連接隊(duì)列工廠
                QueueConnectionFactory queueConnectionFactory =
                    (QueueConnectionFactory) context.lookup(
                        "JmsQueueConnectionFactory");

                //獲得JMS信息連接隊(duì)列
                QueueConnection queueConnection =
                    queueConnectionFactory.createQueueConnection();

                //啟動(dòng)接收隊(duì)列線程
                queueConnection.start();
                //產(chǎn)生隊(duì)列Session,設(shè)置事務(wù)為false,自動(dòng)應(yīng)答消息接收
                QueueSession queueSession =
                    queueConnection.createQueueSession(
                        false,
                        Session.AUTO_ACKNOWLEDGE);
                //獲得默認(rèn)內(nèi)建在JMS里的隊(duì)列之一:queue1
                Queue queue = (Queue) context.lookup("queue1");
                //產(chǎn)生JMS隊(duì)列接收器
                QueueReceiver queueReceiver =
                    queueSession.createReceiver(queue);
                //通過同步的方法接收消息
                Message message = queueReceiver.receive();
                String messageText = null;
                if (message instanceof TextMessage)
                    messageText = ((TextMessage) message).                        
                        getText();
                System.out.println(messageText);
                //以下做清除工作,代碼略
                // ... ...
              
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    編譯后運(yùn)行接收信息服務(wù),可以看到接收到并打印之前發(fā)送的消息,再看看控制臺(tái),發(fā)現(xiàn)queue1的消息隊(duì)列變?yōu)?,消息已被讀取,消息發(fā)送和接收到此結(jié)束。

     

    上篇openJms介紹 (一)  提到了openJms的構(gòu)建及消息的發(fā)送和接收,這篇主要了解消息的發(fā)布和訂閱。JMS 的發(fā)布/訂閱模型定義了如何向一個(gè)內(nèi)容節(jié)點(diǎn)發(fā)布和訂閱消息,內(nèi)容節(jié)點(diǎn)也叫主題(topic),主題是為發(fā)布者(publisher)和訂閱者 (subscribe) 提供傳輸?shù)闹薪椤0l(fā)布/訂閱模型使發(fā)布者和訂閱者之間不需要直接通訊(如RMI)就可保證消息的傳送,有效解決系統(tǒng)間耦合問題(當(dāng)然有這個(gè)需要才行),還有就是提供了一對(duì)一、一對(duì)多的通訊方式,比較靈活。

    先介紹JMS里2個(gè)概念,持久訂閱模式和非持久訂閱模式,其實(shí)也是發(fā)布/訂閱模型在可靠性上提供的2種方式:

    非持久訂閱模式:只有當(dāng)客戶端處于激活狀態(tài),也就是和JMS 服務(wù)器保持連接的狀態(tài)下,才能接收到發(fā)送到某個(gè)Topic的消息,而當(dāng)客戶端處于離線狀態(tài)時(shí),則這個(gè)時(shí)間段發(fā)到Topic的消息將會(huì)永遠(yuǎn)接收不到。

    持久訂閱模式:客戶端向JMS 注冊(cè)一個(gè)識(shí)別自己身份的ID,當(dāng)這個(gè)客戶端處于離線時(shí),JMS 服務(wù)器會(huì)為這個(gè)ID 保存所有發(fā)送到主題的消息,當(dāng)客戶再次連接到JMS 服務(wù)器時(shí),會(huì)根據(jù)自己的ID 得到所有當(dāng)自己處于離線時(shí)發(fā)送到主題的消息,即消息永遠(yuǎn)能接收到。

    下面我們就接著來看openJms在發(fā)布/訂閱模式上的表現(xiàn),由于篇幅關(guān)系,在這里只講述非持久訂閱模式,持久訂閱模式可以根據(jù)JMS的標(biāo)準(zhǔn)來試。

    消息發(fā)布的代碼如下:

    package javayou.demo.openjms;
    import java.util.*;
    import javax.jms.*;
    import javax.naming.*;
    public class TopicPublish {
        public static void main(String[] args) {
            try {
                //取得JNDI上下文和連接
                Hashtable properties = new Hashtable();
                properties.put(
                    Context.INITIAL_CONTEXT_FACTORY,
                    "org.exolab.jms.jndi.InitialContextFactory");
                //openJms默認(rèn)的端口是1099
                properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
                Context context = new InitialContext(properties);
                //獲得JMS Topic連接隊(duì)列工廠
                TopicConnectionFactory factory =
                    (TopicConnectionFactory) context.lookup(
                        "JmsTopicConnectionFactory");

                //創(chuàng)建一個(gè)Topic連接,并啟動(dòng)
                TopicConnection topicConnection = factory.createTopicConnection();
                topicConnection.start();

                //創(chuàng)建一個(gè)Topic會(huì)話,并設(shè)置自動(dòng)應(yīng)答
                TopicSession topicSession =
                    topicConnection.createTopicSession(false,
                            Session.AUTO_ACKNOWLEDGE);

                //lookup 得到 topic1
                Topic topic = (Topic) context.lookup("topic1");
                //用Topic會(huì)話生成Topic發(fā)布器
                TopicPublisher topicPublisher = topicSession.createPublisher(topic);

                //發(fā)布消息到Topic
                System.out.println("消息發(fā)布到Topic");
                TextMessage message = topicSession.createTextMessage
                    ("你好,歡迎定購(gòu)Topic類消息");
                topicPublisher.publish(message);

                //資源清除,代碼略  ... ...   
            } catch (NamingException e) {
                e.printStackTrace();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }

    而訂閱消息的接收有同步的和異步2種,他們分別使用receive()和onMessage(Message message)方法來接收消息,具體代碼:

    同步接收:

    package javayou.demo.openjms;
    import java.util.*;
    import javax.jms.*;
    import javax.naming.*;
    public class TopicSubscribeSynchronous {

        public static void main(String[] args) {
            try {
                System.out.println("定購(gòu)消息接收啟動(dòng):");
                //取得JNDI上下文和連接
                Hashtable properties = new Hashtable();
                properties.put(Context.INITIAL_CONTEXT_FACTORY,
                    "org.exolab.jms.jndi.InitialContextFactory");
                properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
                Context context = new InitialContext(properties);

                //獲得Topic工廠和Connection
                TopicConnectionFactory factory =
                    (TopicConnectionFactory) context.lookup(
                        "JmsTopicConnectionFactory");
                TopicConnection topicConnection = factory.createTopicConnection();
                topicConnection.start();

                //創(chuàng)建Topic的會(huì)話,用于接收信息
                TopicSession topicSession =
                    topicConnection.createTopicSession(
                        false,
                        Session.AUTO_ACKNOWLEDGE);

                //lookup topic1
                Topic topic = (Topic) context.lookup("topic1");
                        //創(chuàng)建Topic subscriber
                TopicSubscriber topicSubscriber =
                    topicSession.createSubscriber(topic);
                //收滿10條訂閱消息則退出
                for (int i=0; i<10; i++) {
                    //同步消息接收,使用receive方法,堵塞等待,直到接收消息
                    TextMessage message = (TextMessage) topicSubscriber.receive();
                    System.out.println("接收訂閱消息["+i+"]: " + message.getText());
                }
                //資源清除,代碼略  ... ...
                System.out.println("訂閱接收結(jié)束.");
            } catch (NamingException e) {
                e.printStackTrace();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }

    非同步接收:

    package javayou.demo.openjms;
    import java.util.*;
    import javax.jms.*;
    import javax.naming.*;
    public class TopicSubscribeAsynchronous implements MessageListener {
        private TopicConnection topicConnection;
        private TopicSession topicSession;
        private Topic topic;
        private TopicSubscriber topicSubscriber;

        TopicSubscribeAsynchronous() {
            try {
                //取得JNDI上下文和連接
                Hashtable properties = new Hashtable();
                properties.put(
                    Context.INITIAL_CONTEXT_FACTORY,
                    "org.exolab.jms.jndi.InitialContextFactory");
                properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
                Context context = new InitialContext(properties);

                //取得Topic的連接工廠和連接
                TopicConnectionFactory topicConnectionFactory =
                    (TopicConnectionFactory) context.lookup(
                        "JmsTopicConnectionFactory");
                topicConnection = topicConnectionFactory.createTopicConnection();

                //創(chuàng)建Topic的會(huì)話,用于接收信息
                topicSession =
                    topicConnection.createTopicSession(false,
                        Session.AUTO_ACKNOWLEDGE);
                topic = (Topic) context.lookup("topic1");

                //創(chuàng)建Topic subscriber
                topicSubscriber = topicSession.createSubscriber(topic);
                //設(shè)置訂閱監(jiān)聽
                topicSubscriber.setMessageListener(this);

                //啟動(dòng)信息接收
                topicConnection.start();
            } catch (NamingException e) {
                e.printStackTrace();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }

        public static void main(String[] args) {
            System.out.println("非同步定購(gòu)消息的接收:");
            try {
                TopicSubscribeAsynchronous listener =
                    new TopicSubscribeAsynchronous();
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //收到訂閱信息后自動(dòng)調(diào)用此方法
        public void onMessage(Message message) {
            try {
                String messageText = null;
                if (message instanceof TextMessage)
                    messageText = ((TextMessage) message).getText();
                System.out.println(messageText);
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }

    編譯好后,啟動(dòng)openJms服務(wù),打開admin管理臺(tái),為了運(yùn)行方便,這里先列出三個(gè)類的運(yùn)行命令:
    java -cp .\; -Djava.ext.dirs=.\lib; javayou.demo.openjms.TopicPublish
    java -cp .\; -Djava.ext.dirs=.\lib; javayou.demo.openjms.TopicSubscribeSynchronous
    java -cp .\; -Djava.ext.dirs=.\lib; javayou.demo.openjms.TopicSubscribeAsynchronous

    先運(yùn)行2個(gè)接收命令,再運(yùn)行發(fā)布命令,可以看到控制臺(tái)的Topic有消息接收,并且接收1和2都有消息接收的提示,到此完成演示,由于是非持久訂閱,所以可以看到控制臺(tái)上的Topic消息條數(shù)不會(huì)減少。

    posted on 2007-05-06 11:45 張金鵬 閱讀(155) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 日韩国产免费一区二区三区| 一区二区三区在线免费 | 亚洲综合亚洲国产尤物| caoporn国产精品免费| 亚洲日本中文字幕一区二区三区| 色多多免费视频观看区一区| 国产在线观看免费不卡| 极品色天使在线婷婷天堂亚洲| 国产在线观看免费视频播放器| 羞羞漫画登录页面免费| 免费大片黄手机在线观看| 中国精品一级毛片免费播放| 久久精品国产精品亚洲| 三级网站在线免费观看| 亚洲一二成人精品区| 4455永久在线观免费看| 亚洲人成色4444在线观看| 免费人成在线观看播放国产| rh男男车车的车车免费网站| 亚洲成AV人在线播放无码| 91久久精品国产免费直播| 亚洲av无码久久忘忧草| 国产大片免费观看中文字幕| a级毛片在线免费| 亚洲天堂中文字幕在线观看| 国产男女性潮高清免费网站 | 久久综合亚洲色HEZYO社区| h片在线免费观看| 亚洲日韩在线中文字幕综合 | 亚洲精品欧洲精品| 在线中文高清资源免费观看| 新最免费影视大全在线播放| 亚洲国产女人aaa毛片在线| 成年女人视频网站免费m| 四虎影视久久久免费| 亚洲综合精品一二三区在线| 国产成人在线免费观看| 色欲A∨无码蜜臀AV免费播| 亚洲乱人伦中文字幕无码| 亚洲码国产精品高潮在线| 一二三四视频在线观看中文版免费|