置步骤,查找ConnectionFactory 和Destination,创建Connection 和Session,如节9。1 “准备 发送和接收消息”中所述。 import javax。naming。*; import javax。jms。*; /* Look up connection factory */ ConnectionFactory connectionFactory; Context messaging = new InitialContext(); connectionFactory = (ConnectionFactory) Messaging。lookup(〃ConnectionFactory〃) /* Look up destination */ Topic newsFeedTopic; newsFeedTopic = messaging。lookup(〃BreakingNews〃); /* Create connection and session */ Connection connection; Session session; connection = ConnectionFactory。createConnection(); session = connection。createSession(false; Session。AUTO_ACKNOWLEDGE); 执行完常规的设置后,客户端程序可以创建到目的地的永久订阅者。使用 session。createDurableSubscriber 来创建永久TopicSubscriber 。名字“mySubscription”用于标 识永久订阅。 session。createDurableSubscriber(newsFeedTopic;〃mySubscription〃); 此时,客户端程序可以启动连接和开始接收消息。 9。3。3。2 重新连接使用永久订阅的Topic 为了重新连接一个存在永久订阅的 Topic ,客户端程序可以简单的再次调用 session。createDurableSubscriber,参数和以前的相同。客户端程序可以中断连接。使用永久 订阅可以让从Topic 消费消息的客户端程序始终能够得到消息,即使客户端程序不是持续连 接的。 /* Reconnect to a durable subscription */ session。createDurableSubscriber(newsFeedTopic; 〃mySubscription〃); 这将会重新建立客户端程序到Topic 的连接,并且转发客户端断开时到达的消息。但是 需要知道几个重要的限制: z 客户端必须使用同一个Connection 。 z Destination 和订阅的名字必须和以前的一样。 z 如果指定了消息选择器,则它的名字也必须和以前的一样。 如果不能满足这些条件,那么永久订阅被删除,并创建一个新的订阅。 60 / 66 …………………………………………………………Page 61…………………………………………………………… 9。4 JMS 消息类型 有五个 JMS 消息类型。本节提供了如何创建和解包每种消息类型的例子。在每个例子 中,在消息中的数据都是与股票报价相关的数据。任何情况下,创建消息真正内容的代码都 是可以忽略的。 9。4。1 创建TextMessage 在这个例子中,股票报价信息作为 TextMessgae 被发送。TextMessage 携带了可以被客 户端作为文本字符串读取的消息。 下面的代码解释了如何创建这样的消息: String stockData; /* Stock information as a string */ TextMessage message; message = session。createTextMessage(); /* Set the stockData string to the message body */ message。setText(stockData); 9。4。2 解包TextMessage 为了解包TextMessage ,客户端使用Message。getText 方法。 String stockInfo; /* String to hold stock info */ stockInfo = message。getText(); 9。4。3 创建BytesMessage 股票报价信息可以以字节格式发送,服务器知道如何构造它,客户端知道如何作为股票 报价来解析和展现它。它作为BytesMessage 被发送。 这样的消息可以按下面的方式来构造: byte'' stockData; /* Stock information as a byte array */ BytesMessage message; message = session。createBytesMessage(); message。writeBytes(stockData); 9。4。4 解包BytesMessage 当收到BytesMessage 时,可以按照以下方式来解包: byte'' stockInfo; /* Byte array to hold stock information */ int length; length = message。readBytes(stockData); 消息体被复制到字节数组。客户端程序然后可以开始读和解析数据。 61 / 66 …………………………………………………………Page 62…………………………………………………………… 9。4。5 创建MapMessage 由服务器发送的每个股票消息都可以是不同股票报价名字/ 值对的映射,使用 MapMessage。例如,它可以包含以下条目: z 股票订价名称——String z 当前的值——double z 订价时间——long z 最后更新——double z 股票信息——String 为了构造MapMessage,客户端程序使用不同的与MapMessage 关联的set 方法(setString, setLong 等等),并在MapMessage 中设置命名的值。 String stockName; /* Name of the stock */ double stockValue; /* Current value of the stock */ long stockTime; /* Time the stock quote was updated */ double stockDiff; /* the +/hange in the stock quote*/ String stockInfo; /* Other information on this stock */ MapMessage message; message = session。createMapMessage(); 注意,下面的设置可以按任何顺序进行: /* First parameter is the name of the map element; * second is the value */ message。setString(〃Name〃; 〃SUNW〃); message。setDouble(〃Value〃; stockValue); message。setLong(〃Time〃; stockTime); message。setDouble(〃Diff〃; stockDiff); message。setString(〃Info〃; 〃Recent server announcement causes market interest〃); 9。4。6 解包MapMessage 为了解包MapMessage,客户端程序使用不同的与MapMessage 相关的get 方法来获取 MapMessage 各元素的值。在下面的例子中,客户端程序希望得到某些MapMessage 元素。 String stockName; /*Name of the stock */ double stockValue; /* Current value of the stock */ long stockTime; /* Time of the stock update */ double stockDiff; /* +/hange in the stock */ String stockInfo; /* Information on this stock */ 通过使用 get 方法和提供期望的值的名字从消息中取出的数据。可以按任意顺序从 MapMessage 中得到它的元素。 stockName = message。getString(〃Name〃); stockDiff = message。getDouble(〃Diff〃); stockValue = message。getDouble(〃Value〃); 62 /