發送訊息
不管是將訊息發送到隊列還是發布到主題,編程的步驟是相同的,差別在於使用不同的JMS對象。具體定義見表:
發送訊息的過程大體分為以下幾步;
1、獲得一個Weblogic Server內容相關的引用;
2、建立串連工廠;
3、使用串連工廠建立一個串連;
4、使用串連建立一個會話;
5、擷取一個目的;
6、使用會話和目的建立訊息的生產者;
7、建立訊息對象;
8、使用串連建立一個需要發送的訊息類型的執行個體;
9、使用串連的一個隊列發送器或主題公布器,然後使用發送器或公布器發送訊息。
在敲代碼之前要先匯入需要的JAR包,並且配置JMS伺服器。
注意:
wlfullclient.jar產生方式是,進入weblogic的安裝目錄例如C:\Oracle\Middleware\wlserver_10.3\server\lib,運行 java -jar wljarbuilder.jar就能產生wlfullclient.jar檔案
JMS伺服器配置請參考《學習在Weblogic伺服器中配置Message Service器圖解
》
發送訊息代碼:
package com.xu.Pub2Sub;import java.util.Properties;import javax.jms.JMSException;import javax.jms.Session;import javax.jms.TextMessage;import javax.jms.Topic;import javax.jms.TopicConnection;import javax.jms.TopicConnectionFactory;import javax.jms.TopicPublisher;import javax.jms.TopicSession;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;public class MsgTopicProducer {/** * @功能:主題寄件者 * @作者: * @日期:2012-10-18 */private TopicPublisher publisher;private TextMessage msg;public MsgTopicProducer(String[] args) throws NamingException, JMSException{/*初始化內容物件*/String url = "t3://localhost:7001";Properties p = new Properties();p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");p.put(Context.PROVIDER_URL, url);Context ctx = new InitialContext(p);/*建立一個串連工廠*/TopicConnectionFactory tConFactory = (TopicConnectionFactory)ctx.lookup("weblogic.jms.ConnectionFactory");/*建立一個主題*/Topic messageTopic = (Topic) ctx.lookup("jms/MyTopic");/*建立一個串連*/TopicConnection tCon = tConFactory.createTopicConnection();/*建立一個會話*/TopicSession session = tCon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);/*建立一個主題發行者,並發送訊息*/publisher = session.createPublisher(messageTopic);msg = session.createTextMessage();}public void runClient() throws JMSException{msg.setText("Hello");publisher.publish(msg);msg.setText("Welcome to JMS!");publisher.publish(msg);System.out.println("成功!");}public static void main(String[] args) throws NamingException, JMSException {MsgTopicProducer mp = new MsgTopicProducer(args);mp.runClient();}}
同步接收者代碼:
package com.xu.Pub2Sub;import java.util.Properties;import javax.jms.JMSException;import javax.jms.Session;import javax.jms.TextMessage;import javax.jms.Topic;import javax.jms.TopicConnection;import javax.jms.TopicConnectionFactory;import javax.jms.TopicSession;import javax.jms.TopicSubscriber;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;public class SyncMessageTopicReceiver {/** * @功能:發布-訂閱Message Service 同步接收者 * @作者: * @日期:2012-10-18 */private TopicSubscriber subscriber ;private TextMessage msg;public SyncMessageTopicReceiver() throws NamingException, JMSException{/*初始化內容物件*/String url = "t3://localhost:7001";Properties p = new Properties();p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");p.put(Context.PROVIDER_URL, url);Context ctx = new InitialContext(p);/*建立主題串連工廠*/TopicConnectionFactory tConFactory = (TopicConnectionFactory) ctx.lookup("weblogic.jms.ConnectionFactory");/*建立一個主題*/Topic messageTopic = (Topic) ctx.lookup("jms/MyTopic");/*建立串連*/TopicConnection tCon = tConFactory.createTopicConnection();/*建立會話*/TopicSession session = tCon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);/*建立接收者*/subscriber = session.createSubscriber(messageTopic);tCon.start();}public void runClient() throws JMSException{msg = (TextMessage) subscriber.receive();System.out.println("Receiver:"+msg.getText());msg = (TextMessage) subscriber.receive();System.out.println("Receiver:"+msg.getText());}public static void main(String[] args) throws NamingException, JMSException {SyncMessageTopicReceiver receiver = new SyncMessageTopicReceiver();receiver.runClient();}}
非同步接收者代碼:
package com.xu.Pub2Sub;import java.util.Properties;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.Session;import javax.jms.TextMessage;import javax.jms.Topic;import javax.jms.TopicConnection;import javax.jms.TopicConnectionFactory;import javax.jms.TopicSession;import javax.jms.TopicSubscriber;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;public class AsyncMessageTopicReceiver implements MessageListener {/** * @功能:發布-訂閱Message Service 非同步接收訊息 * @作者: * @日期:2012-10-18 */private int EXPECTED_MESSAGE_COUNT = 10;private int messageCount = 0;private TopicSubscriber subscriber;public AsyncMessageTopicReceiver() throws NamingException, JMSException {/* 初始化內容物件 */String url = "t3://localhost:7001";Properties p = new Properties();p.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");p.put(Context.PROVIDER_URL, url);Context ctx = new InitialContext(p);/*建立主題串連工廠*/TopicConnectionFactory tConFactory = (TopicConnectionFactory) ctx.lookup("weblogic.jms.ConnectionFactory");/*建立一個主題*/Topic messageTopic = (Topic) ctx.lookup("jms/MyTopic");/*建立串連*/TopicConnection tCon = tConFactory.createTopicConnection();/*建立會話*/TopicSession session = tCon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);/*建立接收者*/subscriber = session.createSubscriber(messageTopic);/* 設定監聽 */subscriber.setMessageListener(this);tCon.start();}public boolean expectMoreMessage() {return messageCount < EXPECTED_MESSAGE_COUNT;}@Overridepublic void onMessage(Message message) {System.out.println("onMessage");try {TextMessage msg = (TextMessage) message;System.out.println("Receiver:" + msg.getText());} catch (JMSException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}messageCount++;}public static void main(String[] args) throws NamingException, JMSException {int MAX_TRIES = 30;int tryCount = 0;AsyncMessageTopicReceiver receiver = new AsyncMessageTopicReceiver();while (receiver.expectMoreMessage() && (tryCount < MAX_TRIES)) {try {System.out.println(tryCount);Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}tryCount++;}}}
wlfullclient.jar產生方式是,進入weblogic的安裝目錄例如C:\Oracle\Middleware\wlserver_10.3\server\lib,運行 java -jar wljarbuilder.jar就能產生wlfullclient.jar檔案