一、准备环境
本文假设你还不知道什么是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值修改得恰当些即可
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:请问转发微博抽奖送英国国籍的活动什么时候开始啊?
好 就是这个样子,你完全可以当它是个聊天室。
我希望我的示例看上去就是可用的,所以附个图: