JMS入門(一)從簡單示例開始

 一、準備環境

本文假設你還不知道什麼是JMS,我們準備今天只完成一個簡單示例以獲取點感性認識,首先需要一個 ActiveMQ,可以在這裏找到:
http://mirror.bit.edu.cn/apache/activemq/apache-activemq/5.7.0/apache-activemq-5.7.0-bin.zip
如果鏈接不可用,可嘗試其他地址:
http://www.apache.org/dyn/closer.cgi?path=/activemq/apache-activemq/5.7.0/apache-activemq-5.7.0-bin.zip
我把它解壓後丟在了E盤根目錄下 ,然後運行 E:\apache-activemq-5.7.0\bin\activemq.bat 文件。
在此之前 可能有必要將 ActiveMQ 內存、磁盤、和臨時存儲空間的限制改小一些,如果環境不滿足這個配置,那麼啓動時會收到錯誤提示。
將E:\apache-activemq-5.7.0\conf\activemq.xml 中如下limit值修改得恰當些即可
 <systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="64 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="100 gb"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="50 gb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>
OK,所有的環境都已經準備好了

二、示例預覽

這是模擬三個用戶聊天的一個示例,每個用戶都將消息發送到JMS服務器,其他所有客戶端都可以接收到消息:

這是來自《Java消息服務》的代碼,這個示例只有這一個類

package ch02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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.TopicPublisher;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.InitialContext;

public class Chat implements MessageListener{

	private TopicSession pubSession;
	private TopicPublisher publisher;
	private TopicConnection connection;
	private String username;

	public Chat(String topicFactory, String topicName, String username)
			throws Exception {

		InitialContext ctx = new InitialContext();

		// 查找一個JMS連接工廠並創建連接
		TopicConnectionFactory conFactory = (TopicConnectionFactory) ctx
				.lookup(topicFactory);
		// TopicConnection表示和消息服務器的一個連接
		TopicConnection connection = conFactory.createTopicConnection();

		// 創建兩個個JMS會話對象
		// 第一個參數:Session是不是事務性的;第二個參數:JMS客戶端使用的確認模式
		TopicSession pubSession = connection.createTopicSession(false,
				Session.AUTO_ACKNOWLEDGE);
		TopicSession subSession = connection.createTopicSession(false,
				Session.AUTO_ACKNOWLEDGE);

		// 查找一個JMS主題
		Topic chatTopic = (Topic) ctx.lookup(topicName);

		// 這兩個對象專屬於創建他們的TopicSession
		TopicPublisher publisher = pubSession.createPublisher(chatTopic);
		TopicSubscriber subscriber = subSession.createSubscriber(chatTopic,
				null, true);

		// JMS發佈/訂閱模型使用Java事件模型,以便TopicSubscriber通知它在同一過程中的MessageListener對象:一條來自消息服務器的消息已經到達
		subscriber.setMessageListener((MessageListener) this);

		this.connection = connection;
		this.pubSession = pubSession;
		this.publisher = publisher;
		this.username = username;

		connection.start();

		System.out.println("start");

	}

	/**
	 * 接收來自TopicSubscriber的消息
	 * 
	 * @param message
	 */
	public void onMessage(Message message) {
		try {
			TextMessage textMessage = (TextMessage) message;
			System.out.println(textMessage.getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

	public void writeMessage(String text) throws JMSException {
		TextMessage message = pubSession.createTextMessage();
		message.setText(username + ":" + text);
		publisher.publish(message);
	}

	public void close() throws JMSException {
		connection.close();
	}

	public static void main(String[] args) {
		try {
			if (args.length != 3) {
				System.out.println("Factory,Topic,or username missing");
			}

			Chat chat = new Chat(args[0], args[1], args[2]);

			BufferedReader commandLine = new BufferedReader(
					new InputStreamReader(System.in));

			while (true) {
				String s = commandLine.readLine();
				if (s.equalsIgnoreCase("exit")) {
					chat.close();
					System.exit(0);
				} else {
					chat.writeMessage(s);
				}
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
它還帶有一個配置文件

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
java.naming.security.principal=system
java.naming.security.credentials=manager
connectionFactoryNames = TopicCF
topic.topic1 = jms.topic1
關於代碼及這些配置 打算在下一篇再解釋 因爲我現在還沒準備好 ( ̄﹏ ̄). z Z好懶

三、運行示例

爲了方便編譯,我爲你準備了build.xml ,在主目錄下運行 ant 即可
編譯好後,打開一個cmd窗口,進入主目錄(就是 build.xml 所在目錄)運行:
...JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Cameron
最後一個參數爲 Cameron ,是個用戶名,可以隨便取,老卡剛好來華,就叫 Cameron 好了
光有老卡還不行,我們再添加兩個中國網友,就叫 Obama 和 Times,分別再打開兩個cmd窗口,運行:
JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Obama
JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Times
下面我們幫首相發一條微博:"Hello my friends in China. I’m pleased to have joined Weibo and look forward to visiting China very soon"
...JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Cameron
log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.WireFormatNegotiator).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
start
Times:
Hello my friends in China. I’m pleased to have joined Weibo and look forward to visiting China very soon

這時 Obama 問首相先生了:
...JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Obama
log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.WireFormatNegotiator).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
start
Times:
Cameron:Hello my friends in China. I’m pleased to have joined Weibo and look forward to visiting China very soon
大英博物館的中國文物什麼時候還?

網友 Times 也留言了:
...JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Times
log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.WireFormatNegotiator).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
start


Cameron:Hello my friends in China. I’m pleased to have joined Weibo and look forward to visiting China very soon
Obama:大英博物館的中國文物什麼時候還?
請問轉發微博抽獎送英國國籍的活動什麼時候開始啊?

微博嘛,所以老卡肯定能看到這些留言了,看看老卡的窗口:
...JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Cameron
log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.WireFormatNegotiator).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
start


Times:
Hello my friends in China. I’m pleased to have joined Weibo and look forward to visiting China very soon
Obama:大英博物館的中國文物什麼時候還?
Times:請問轉發微博抽獎送英國國籍的活動什麼時候開始啊?

好 就是這個樣子,你完全可以當它是個聊天室。 

我希望我的示例看上去就是可用的,所以附個圖:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章