1、ConnectionFactory connectionFactory = (ConnectionFactory)ctx.lookup(JNDI_NAME );如果应用程序与服务器不在同一个虚拟机时Hashtable env = new Hashtable();env.put(Context.INITIAL_CONTEXT_FACTORY,com.apusic.naming.jndi.CNContextFactoryenv.put(Context.PROVIDER_URL, iiop:/hostname:4888 /取决于地址和端口new InitialContext(env);JNDI_NA
2、ME DestinationsDestinations 是指消息发送客户端的消息目标和消息接收客户端的消息来源,它也是预先在jms.xml定义好的。对于PTP类 型,Destinations对应的类型为Queue,对于Pub/Sub 类型,Destinations对应的类型为Topic。获取方式:Destination myDest = (Destination) ctx.lookup(testTopicQueue myQueue = (Queue) ctx.lookup(testQueue或者:/通过下面这种方式创建出来的Queue,代表一个远程 AMQ 服务器上的队列,符号之前/是队列的名
3、称,符号之后是服务器路由名。发送消息到该队列时,会将消息路由到符号之后/指定的服务器,并将消息放进符号之前指定的队列。Queue messageQueue = queueSession.createQueue(testQueueServerRouterName Connections为 客户端和消息服务器建立的一个连接,它可以创建Session,并且可以创建多个Session(稍后介绍)。获取方法:Connection connection = connectionFactory.createConnection();当使用完连接的时候,你需要关闭连接,否则该连接会一直保持。关闭连接的时候它同
4、时会关闭该连接产生的 Session。connection.close();连接创建好后,一般先调用 start() 方法。 SessionsSessions是单线程的,用来创建消息发送 者和消息接受者的上下文。Sessions 同时还可以执行 Message ListenersSession session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);Sessio
5、n session = connection.createSession(false, Session.DUPS_OK_ACKNOWLEDGE);三种应答模式的差别,请参照 AMQ 相关概念中的应答模式。 Message Producersmessage producer是由Session创建的一个对象,它是用来向 Destinations 发送信息的。MessageProducer producer = session.createProducer(myDest);MessageProducer producer = session.createProducer(myTopic);Queue
6、Sender sender = queueSession.createSender(messageQueue);也可以创建时不指定Destinations ,发送时再指定。创建好后,可以继续创建消息,然后调用发送方法发送消 息。TextMessage message = session.createTextMessage();message.setText(msg_text);producer.send(message);当发送时指定 Destinations ,你的使用方法如下:MessageProducer anon_prod = session.createProducer(null);
7、anon_prod.send(myQueue, message); Message Consumersmessage consumer是指从 destination 接收消息的对象MessageConsumer consumer = session.createConsumer(myQueue);MessageConsumer consumer = session.createConsumer(myTopic);你还能使用 Session.createDurableSubscriber 创建一个持久的Topic注册对象。它 和普通的Topic注册对象的区别是不管当前是否在线,均能收到对应Des
8、tination的全部信息String subName = MySub;MessageConsumer topicSubscriber = session.createDurableSubscriber(myTopic, subName);停止持久的Topic注册对象使用以下方法。topicSubscriber.close();session.unsubscribe(使用Consumer前应该先调用 connection.start() 方法connection.start();Message m = consumer.receive();/或者Message m = consumer.rec
9、eive(3000); / 3秒后超时 Message Listeners这 是为异步调用设计的一种方式。它是把 消息监听器 注册到consumer中,然后消息监听器实现一个onMesseag()方法,当消息到达是,会调用消息监听器的onMesseag()方法。Listener myListener = new Listener();consumer.setMessageListener(myListener); Message SelectorsAMQ 允许消息选择性的接收,语法符合SQL92。例如:客户只收取消息属性 NewsType 为 Sports和 Opinion的消息。NewsTy
10、pe = Sports OR NewsType = Opinion然后再创建 Consumer时指定 Selectors。例如createConsumer(Destination destination, String messageSelector) createConsumer(Destination destination, String messageSelector, boolean NoLocal) createDurableSubscriber(Topic topic, String name, String messageSelector, boolean noLocal) 把
11、其中的messageSelector参数变成NewsType = 即可。6.3.客 户端方式使用JMS6.3.1.开发JMS Client的步骤一 般来说,一个JMS 应用是几个JMS 客户端交换消息,开发JMS 客户端应用由以下几步构成: 用 JNDI 寻找得到ConnectionFactory 对象; 用 JNDI 寻找或者Session的CreateQueue(CreateTopic)方法得到目标队列或主题对象,即Destination 对象; 用ConnectionFactory 创建Connection 对象; 用Connection 对象创建一个或多个JMS Session; 用S
12、ession 和Destination 创建MessageProducer 和MessageConsumer; 通知Connection 开始传递消息。6.3.2.PTP模型应用PTP 模型主要包含消息的发送和接收,下面我们举例说明: 发 送消息1. 首先编辑发送节点的 config/jms.xml 文件,加上以下一段配置:. The default queue connection factorydisplay-nameQueueConnectionFactoryjndi-namejms/QueueConnectionFactory/connection-factory(如果同名的conne
13、ction-factory 已经存在,就不用再创建)同时还要编辑消息的目的节点的 config/jms.xml 文件,加上以下一段配置:queue clustered=falsequeue-nametestQueue/queue(如果同名的queue 已经存在,就不用再创建)2. 启动 AMQ由于 AMQ 目前对配置文件的读取是在启动阶段,所以需要重新启动服务器。3. 编写发送消息客户端代码:Send.javaimport javax.jms.*;import javax.naming.*;import java.io.*;import java.util.*;import java.rmi.
14、RemoteException;/* * Title: JMS * Description: JMS Test * Copyright: Copyright (c) 2003 * Company: Apusic * author Apusic * version 1.0 */public class Send String queueName = /消息的目的队列的队列名 String routerName = RouterB/消息的目的节点的路由名 QueueConnectionFactory queueConnectionFactory = null; Queue queue = null
15、; QueueConnection queueConnection = null; QueueSession queueSession = null; QueueSender queueSender = null; TextMessage message = null; public static void main(String args) throws Exception InitialContext ic = getInitialContext(); Send sender = new Send(); sender.init(ic) ; sender.sendMessage(); sen
16、der.close(); public void init(InitialContext ctx) throws Exception queueConnectionFactory = (QueueConnectionFactory)ctx.lookup(jms/QueueConnectionFactory queueConnection = queueConnectionFactory.createQueueConnection(); public void sendMessage() throws JMSException,RemoteException queueSession = que
17、ueConnection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE); /队列由:队列名 + 目的节点路由名 在网络中唯一标识,通过该方式创建的队列 /将代表远程节点上的某个队列 queue = queueSession.createQueue(queueName + + routerName); queueSender = queueSession.createSender(queue); queueSender.setDeliveryMode(DeliveryMode.PERSISTENT); message = queueSess
18、ion.createTextMessage(); message.setText(The Message from testQueue queueSender.send(message); public void close() throws JMSException if (queueConnection!=null) queueConnection.close(); private static InitialContext getInitialContext() throws NamingException Hashtable env = new Hashtable(); env.put
19、(Context.INITIAL_CONTEXT_FACTORY, env.put(Context.PROVIDER_URL, /localhost: return (new InitialContext(env); 接收消息该 部分建立在发送消息时 jms.xml 已经配置好connection-factory,queue 的前提下 在目的节点编写接收消息客户端代码:Receive.javapublic class Receive QueueReceiver queueReceiver = null; Receive receiver = new Receive(); receiver.in
20、it(ic) ; receiver.TBreceiveMessage();/你可以在此处调用YBreceiveMessage receiver.close(); /采用以下的lookup方法找回来的队列是本地节点的队列 queue = (Queue) ctx.lookup(queueName); /假如想收取远程节点的队列上的消息时,采用以下的createQueue方法创建一个远程的队列。 在网络中唯一标识。 /通过该方式创建的队列将代表远程节点上的某个队列,收取消息时将直接收取该节点的该队列上的消息。 /queue = queueSession.createQueue(queueName +
21、 public void TBreceiveMessage() throws NamingException, JMSException,RemoteException queueReceiver = queueSession.createReceiver(queue); queueConnection.start(); for (;) message = (TextMessage) queueReceiver.receive(); System.out.println(Reading message: + message.getText(); if (message.getText().eq
22、uals(quit) break; public void YBreceiveMessage() throws NamingException, JMSException,RemoteException,IOException /register my textListener which comes from MessageListener TextMessageListener textListener = new TextMessageListener(); queueReceiver.setMessageListener(textListener);To end program, enter Q or q, then InputStreamReader reader = new InputStreamReader(System.in); char answer = 0 while (!(answer = q) | (answer = Q) answer = (char)reader.read(); if (queueReceiver! queueReceiver.close(); if (queueSession! queueSession.close(); env.put(Context.INITIAL_CONTEXT_FACTORY,/localh
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1