文章来源(IBM中国)
相同又不同
下面有这两个 pub/sub 程序——TPublisher.java 的代码清单 和 TSubscriber.java 的代码清单。我们不再像对 PTP 程序那样一步一步地去分析它们,因为除了所使用的 JMS 接口之外,它们与 QSender.java 和 QReceiver.java 是完全一样的。
在运行这些程序之前需要设置管理对象 TopicConnectionFactory 和 Topic。
运行后将会看到它们与 PTP 程序的不同。如果用同样的 QueueConnectionFactory 和 Queue 运行 QReceiver 的多个实例,您会看到在用 QSender 发送消息时,一个 QReceiver 实例只接收一个发送消息。
如果运行 TSubscriber 的多个实例,那么您就会看到从 TPublisher 发送的所有消息是由 TSubscriber 的所有实例接收的。
TPublisher.java 的代码清单
- import java.io.*;
- import javax.jms.*;
- import javax.naming.*;
- public class TPublisher {
- public static void main(String[] args) {
- new TPublisher().publish();
- }
- public void publish() {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- try {
- //Prompt for JNDI names
- System.out.println("Enter TopicConnectionFactory name:");
- String factoryName = reader.readLine();
- System.out.println("Enter Topic name:");
- String topicName = reader.readLine();
- //Look up administered objects
- InitialContext initContext = new InitialContext();
- TopicConnectionFactory factory =
- (TopicConnectionFactory) initContext.lookup(factoryName);
- Topic topic = (Topic) initContext.lookup(topicName);
- initContext.close();
- //Create JMS objects
- TopicConnection connection = factory.createTopicConnection();
- TopicSession session =
- connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
- TopicPublisher publisher = session.createPublisher(topic);
- //Send messages
- String messageText = null;
- while (true) {
- System.out.println("Enter message to send or 'quit':");
- messageText = reader.readLine();
- if ("quit".equals(messageText))
- break;
- TextMessage message = session.createTextMessage(messageText);
- publisher.publish(message);
- }
- //Exit
- System.out.println("Exiting...");
- reader.close();
- connection.close();
- System.out.println("Goodbye!");
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- }
TSubscriber.java 的代码清单
- import java.io.*;
- import javax.jms.*;
- import javax.naming.*;
- public class TSubscriber implements MessageListener {
- private boolean stop = false;
- public static void main(String[] args) {
- new TSubscriber().subscribe();
- }
- public void subscribe() {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- try {
- //Prompt for JNDI names
- System.out.println("Enter TopicConnectionFactory name:");
- String factoryName = reader.readLine();
- System.out.println("Enter Topic name:");
- String topicName = reader.readLine();
- reader.close();
- //Look up administered objects
- InitialContext initContext = new InitialContext();
- TopicConnectionFactory factory =
- (TopicConnectionFactory) initContext.lookup(factoryName);
- Topic topic = (Topic) initContext.lookup(topicName);
- initContext.close();
- //Create JMS objects
- TopicConnection connection = factory.createTopicConnection();
- TopicSession session =
- connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
- TopicSubscriber subscriber = session.createSubscriber(topic);
- subscriber.setMessageListener(this);
- connection.start();
- //Wait for stop
- while (!stop) {
- Thread.sleep(1000);
- }
- //Exit
- System.out.println("Exiting...");
- connection.close();
- System.out.println("Goodbye!");
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- public void onMessage(Message message) {
- try {
- String msgText = ((TextMessage) message).getText();
- System.out.println(msgText);
- if ("stop".equals(msgText))
- stop = true;
- } catch (JMSException e) {
- e.printStackTrace();
- stop = true;
- }
- }
- }
JMS Pub/Sub 实现
本文介绍使用Java消息服务(JMS)实现发布/订阅(Pub/Sub)模式的方法。通过两个示例程序TPublisher.java和TSubscriber.java展示了如何创建发布者和订阅者,以及如何在多个订阅者间广播消息。
208

被折叠的 条评论
为什么被折叠?



