本文简单介绍开源的JMS服务器openJms的用法。 openJms符合SUN的JMS API 1.0.2规范,支持消息队列,还支持消息传递的发布/订阅模式,本文先就系统服务的搭建及JMS的非结构化消息发送和接收进行说明。
JMS 有五种消息类型。三种结构化或半结构化的消息类型(MapMessage、ObjectMessage 和 StreamMessage)以及两种非结构化的或自由格式的消息类型(TextMessage 和 BytesMessage)。而这里虽然我们只对非结构化消息进行说明。
下面介绍如何使用openJms。下载openJms,解压后可以直接使用,在 /openjms-0.7.6.1/bin 里,有openJms的运行脚本,执行 startup 启动,弹出一个新的窗口,服务就运行在新窗口内,shutdown 为停止命令。
服务运行后,就可以开始使用JMS服务了,很简单吧。
在Eclipse建立相关project。将需要的jar:openjms-0.7.6.1.jar,jms-1.0.2a.jar,exolabcore-0.3.7.jar,commons-logging-1.0.3.jar加入到工程目录,可在/openjms-0.7.6.1/lib里可以找到这些jar。
下面是消息发送服务的代码QueueSend.java
package com.peng.openjms;
import java.util.*;
import javax.jms.*;
import javax.jms.Queue;
import javax.naming.*;
public class QueueSend {
public static void main(String[] args) throws NamingException, JMSException {
Hashtable<String, String> prop = new Hashtable<String, String>();
prop.put(Context.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
prop.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
Context context = new InitialContext(prop);
QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup("JmsQueueConnectionFactory");
QueueConnection conn = factory.createQueueConnection();
QueueSession session = conn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) context.lookup("queue1");
QueueSender queueSender = session.createSender(queue);
TextMessage message = session.createTextMessage();
message.setText("Hello, I'm openJms.");
queueSender.send(message);
System.out.println("info in jms queue ");
}
}
执行程序发送消息,然后打开JMS控制台(在openJms解压目录下/bin里面有个admin.bat),用 admin 命令启动管理平台,点击菜单Actions-Start openJMS启动Jms服务器。然后,点击菜单Actions-Connections-online:可以看到JSM默认的队列queue1里已经有1条消息了,而其他的队列还是空着的。(消息是执行QueueSend.java程序产生的)
下面我们来看看消息接收服务的代码QueueReceiveSynchronous.java
package com.peng.openjms;
import java.util.*;
import javax.jms.*;
import javax.jms.Queue;
import javax.naming.*;
public class QueueReceiveSynchronous {
public static void main(String[] args) throws NamingException, JMSException {
Hashtable<String, String> prop = new Hashtable<String, String>();
prop.put(Context.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
prop.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
Context context = new InitialContext(prop);
QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup("JmsQueueConnectionFactory");
QueueConnection conn = factory.createQueueConnection();
conn.start();
QueueSession session = conn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) context.lookup("queue1");
QueueReceiver receiver = session.createReceiver(queue);
Message message = receiver.receive();
String messageText = null;
if (message instanceof TextMessage)
messageText = ((TextMessage) message).getText();
System.out.println(messageText);
}
}
编译后运行接收信息服务,可以看到接收到并打印之前发送的消息,再看看admin控制台,发现queue1的消息队列变为0,消息已被读取,消息发送和接收到此结束。