一、準備環境
本文假設你還不知道什麼是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,所有的環境都已經準備好了
二、示例預覽
這是來自《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好懶三、運行示例
...JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Cameron
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
...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:請問轉發微博抽獎送英國國籍的活動什麼時候開始啊?
好 就是這個樣子,你完全可以當它是個聊天室。
我希望我的示例看上去就是可用的,所以附個圖: