通常,jms应用程序开始于通过Jndi查找连接工厂ConnectionFactory实例,然后通过连接工厂创建Connection,再通过Connection创建Session实例。编程过程呢个非常类似于JDBC,我们将编写一个jms应用程序总结为以下六步:
1,jndi查找ConnectionFactory
2,Factory创建Connection
3,Connection创建sesson
4,session创建生产者、消费者
5,发送、接受消息
6,关闭资源
下面我们一步一步讲解,要使用jndi就必须有一个应用上下文,这里我们首先初始化一个应用上下文:
Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY,"org.exolab.jms.jndi.InitialContextFactory");
properties.put(Context.PROVIDER_URL, "tcp://localhost:3035/");
Context context = new InitialContext(properties);
上述代码以服务器缺省配置创建了一个context,为了避免硬编码设计一些JNDI属性,我们在应用的classpath下新建一个jndi.properties ,以键值对的形式指定属性:
java.naming.factory.initial=org.exolab.jms.jndi.InitialContextFactory java.naming.provider.url=tcp://myhost:3035
现在初始化一个InitialContext 的代码就简化为:
Context context = new InitialContext();
创建ConnectionFactory:
通过JNDI查找连接工厂ConnectionFactory,openjms服务器的openjms.xml配置文件中预设值了一个名为“ConnectionFactory”的连接工厂,下面我们就可以通过这个名字查找。
ConnectionFactory factory = (ConnectionFactory) context.lookup("ConnectionFactory");
创建连接:
使用刚创建的连接工厂ConnectionFactory创建ConnectionFactory连接.
eg:
Connection connection = factory.createConnection();
//注意:这里的 Connection是jms的连接,位于包javax.jms包结构中,而非java.sql.Connection。
创建Session:
使用javax.jms.Connection创建Session,AUTO_ACKNOWLEDGE设定自动应答。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
创建发送者:
要创建一个Producer必须指定目的地,通常目的地和连接工厂一样都是根据jndi获取。jms中分为点对点(point-to-point),发布订阅(publish-and-subscribe)两种,点对点是一对一行为,一个消息只能有一个接受者,而发布订阅模式类似于电视台和观众属于多对多;例如:CCTV1,ccvt2将自己的节目发送给全部观众,我们自己选择喜欢的节目接受收看,也就是接受消息;他们的区别在于消费者的数量;
Destination dest = context.lookup("destname");
MessageProducer sender = session.createProducer(dest);
备注:destname为服务器配置的目的地名称,配置在openjms.xml;
发送消息:
这里我们以文本消息为例,其他类似:
TextMessage message = session.createTextMessage("Hello World!");
sender.send(message); 同步接受消息:
MessageConsumer receiver = session.createConsumer(destination);
connection.start();
TextMessage message = (TextMessage) receiver.receive();异步接受消息:
通过MessageListener实现异步消息接受,核心实例代码如下:
MessageConsumer receiver = session.createConsumer(destination);
receiver.setMessageListener(new MessageListener(){
public void onMessage(Message message) {
TextMessage text = (TextMessage) message;
}
});
connection.start(); //开始连接、传输消息
释放资源:
context.close(); connection.close();