Java消息发送服务(Java Messaging Service,JMS)是提供商无关的一套API,用于在程序间进行可靠的消息发送。在客户端-服务器计算中,客户端程序与服务器与服务器建立联系并请求服务。相反,消息发送应用在相互协作的程序之间发送消息。有些程序(在所谓的“对等(peer-to-peer)”应用中)则相互之间直接交换信息(JXTA使用的就是这种模型)。
现在可以用QueueSender来发送消息到队列。
4. 创建一个消息对象(Message的子类),然后使用QueueSender的发送方法将它们发送至目的地。示例程序从Session中获得一个TextMessage对象。接着示例程序将每个程序参数打包到TextMessage 中,然后使用QueueSender将其发送至队列。注意,同一个TextMessage 可以使用多次。
- TextMessage tm = qs.createTextMessage();
- // 为第一个参数之后的每个参数进行一次循环
- // 以文本消息的形式发送参数字符串
- for (int i = 2; i < args.length; i++) {
- tm.setText(args[i]);
- qsnd.send;
- }
5.关闭QueueConnection。在try/finally程序块的最后一条语句中关闭连接是一个好习惯。这一步很重要:忘记关闭 QueueConnections 将可能导致服务器上的资源泄漏:
- } finally {
- if (qc != null) {
- qc.close();
- }
- }
要发送消息到一个消息队列,可以使用TestQueue程序(在缺省的包中),加上一个参数“send”,例如:
$ java TestQueue send jms/queue/MyTestQueue a b c d
Java Message Service 1.0.2 Reference
Implementation (build b14)
Sent: 'a'
Sent: 'b'
Sent: 'c'
Sent: 'd'
接收消息
TestQueue程序按照以下步骤接收消息:
和2从一个消息队列接收消息的起先两步与发送消息是一样的:先是查找连接工厂,再获得一个QueueConnection,然后查找Queue。
从QueueSession 获得一个QueueReceiver :
QueueReceiver qrcv = qs.createReceiver(q);
3. 从Queue接收消息。示例程序进入一个循环,在这个循环中从队列获取消息并将它们打印到标准输出设备。
- qc.start();
- Message m = qrcv.receive(10000);
- while (m != null) {
- if (m instanceof TextMessage) {
- TextMessage tm = (TextMessage)m;
- System.out.println("Received text: '" +
- tm.getText() + "'");
- } else {
- System.out.println("Received a " +
- m.getClass().getName());
- }
- m = qrcv.receive(100);
- } finally {
- if (qc != null) {
- qc.close();
- }
- }
对QueueConnection的启动方法的调用将告诉连接开始接收消息。QueueReceiver接收方法带有一个参数,该参数表明了等待一条消息的毫秒数。如果消息没有在规定时间内到达,该方法将返回null值。直到消息队列在100毫秒的时间内都保持为空,程序才开始读取和打印收到的消息。在try/finally程序块的结尾有一个finally子句,该子句像前面例子中一样地关闭QueueConnection。
要接收消息队列中的消息,可以使用TestQueue程序,再带上一个参数“recy”,例如:
$ java TestQueue recv jms/queue/MyTestQueue
Java Message Service 1.0.2 Reference
Implementation (build b14)
Received text: 'a'
Received text: 'b'
Received text: 'c'
Received text: 'd'
配置服务器
如果你使用的不是参考引用,或者你想更改队列和/或队列连接工厂的名字,你就需要通过使用平台的管理工具配置JMS提供者。队列或者连接工厂被创建之后,便留在服务器中,直到服务器重新启动。有些平台实现可能会为客户端提供扩展API,以便程序化地创建目的地和连接工厂。
用来在J2EE SDK下创建受管理的对象的工具是。要配置服务器,需:
启动应用服务器。
Create a message queue, giving it a JNDI name. (Do this only once.) To create a
new message queue in the J2EE SDK, first decide on a name for your message
queue. It can be convenient for administration purposes to choose a name that
indicates that the queue is used by JMS, for example, jms/MyTestQueue. Then
execute the command:创建一个消息队列,并为它取一个JNDI名。(只做一次。)要用J2EE SDK创建一个新的消息队列,首先需要为消息队列决定一个名字。为了便于管理, 应该选择一个可以表明该队列是JMS使用的队列,例如jms/MyTestQueue。然后执行命令:
j2eeadmin -addJmsDestination
用消息队列的实际名字替换
由于连接工厂名QueueConnectionFactory被硬性地放在示例程序中,因此要告诉程序使用一个不同的连接工厂名,就必须修改源代码,并且重新编译。例如,在TestQueue.java中:
- // Change this variable's value to change the
- // connection factory name
- protected static String qfactoryName =
- "QueueConnectionFactory"
重新编译之后,使用j2eeadmin(或者你自己的服务器的工具)创建一个connection factory,给它取个JNDI名,如:
j2eeadmin -addJmsFactory jms/MyQueueConnectionFactory
要列出连接工厂,使用:
j2eeadmin -listJmsFactory
要列出目的地,使用:
j2eeadmin -listJmsDestination
对于不是J2EE SDK的平台,可以在该平台上使用J2EE产品的部署工具来创建所需的消息队列和连接工厂。
运行示例代码
下载这些期的示例存档。这个JAR文件包含了示例程序的完整源代码,包括Java程序文件和HTML格式的文件。你可以使用命令jar xvf ttmar2003.jar 将示例jar中的内容解压缩到你的工作目录下。在运行示例程序前,要确保J2EE服务器正在运行。
多次运行示例程序。试着发送一些成批的消息,但是不接收这些消息,检查一下输出的顺序。
这个示例程序为你试着使用JMS队列提供了切入点。探索一下JMS接口使用的API。例如,可以更改一下程序,试着使用三种不同的接收方式。探索一下事务性的消息发送,或者试着发送各种类型的消息对象。JMS有许多特性,熟练使用它可以提高你的应用设计水平。
