createQueue 或 createTopic 方法及缺省消息传递提供程序
您可以使用 Session.createQueue(String) 方法或 Session.createTopic(String) 方法,而不是 JNDI 查询,来为缺省消息传递提供程序创建 JMS 队列或 JMS 主题。
Queue q = mySession.createQueue("Q1");
创建一个可用来引用现有目标 Q1 的 JMS 队列实例。
对于缺省消息传递提供程序,现有目标作为队列或主题空间在会话所连接的总线上存在。
createQueue
使用 Session.createQueue(String) 方法来创建代表现有目标的 JMS 队列对象。 这会提供另一种不易于管理的方法来通过 JNDI 查询获取管理定义的 JSM 队列对象。
- 简单格式
- 在其最简单的格式中,createQueue 方法的参数为会话所连接的总线上的现有目标名称。例如,如果存在名为 Q1 的队列,那么通过以下方法会创建可用于引用此目标的 JMS 队列实例:
Queue q = mySession.createQueue("Q1");
- URI 格式
- 对于更为复杂的情况,应用程序可使用基于 URI 的格式。URI 格式允许提供任意数量的名称值对,以设置 Queue 对象的各种属性。
使用前缀 queue:// 后跟目标名称,对队列 URI 进行标识。先前的 Q1 简单格式可以使用以下 URI 来表示:
Queue q = mySession.createQueue("queue://Q1");
名称值对通过问号 ? 引入。 例如,应用程序可能将会话连接到一个总线,然后使用以下格式来在名为 otherBus 的其他总线上创建 Q2 的 JMS 队列实例。
当将消息发送至 IBM MQ 时,队列名称后必须紧跟 at 符号 (@) 以及队列所在的队列管理器的名称,例如:Queue q = mySession.createQueue("queue://Q2?busName=otherBus");
Queue q = mySession.createQueue("queue://Q2@qmgr?busName=otherBus");
使用 & 符号分隔多个名称值对,例如:Queue q = mySession.createQueue("queue://Q2?busName=otherBus&deliveryMode= Application&readAhead=AsConnection&priority=6");
- 属性
- busName、deliveryMode、priority、readAhead 和 timeToLive。请参阅生成的 API 信息,以获取这些属性的描述。
createTopic
使用 Session.createTopic(String) 方法来创建代表现有目标的 JMS 主题对象。 (请注意,针对主题,是主题空间而不是存在的主题。)这会提供另一种不易于管理的方法来通过 JNDI 查询获取管理定义的 JSM 主题对象。
- 简单格式
- 在其最简单的格式中,createTopic 方法的参数为会话所连接的总线上的缺省主题空间中的主题名称。例如,如果存在缺省主题空间,那么可以使用 JMS 主题实例来引用缺省主题空间上的 cats 主题:
Topic t = mySession.createTopic("cats");
要指定非缺省主题空间,可以使用格式为 topicSpace:topic 的特殊语法。例如:Topic t = mySession.createTopic("kennelTopicSpace:dogs");
- URI 格式
- 对于更复杂的情况,可以使用基于 URI 的格式。使用前缀 topic:// 后跟主题名称对主题 URI 进行标识。先前的示例可以表示为以下 URI:
Topic t = mySession.createTopic("topic://cats"); Topic t = mySession.createTopic("topic://dogs?topicSpace=kennelTopicSpace");
对于队列,使用 & 分隔多个名称值对。
- 属性
- busName、deliveryMode、priority、readAhead、timeToLive 和 topicSpace。请参阅生成的 API 信息,以获取这些属性的描述。
支持 MA88 URI
WebSphere® Application Server V5.1 应用程序可以使用 createQueue 和 createTopic 方法为 V5 嵌入式消息传递提供程序(V5.1 JMS 消息传递提供程序)创建 JSM 队列和主题对象。为帮助您迁移这些应用程序,缺省消息传递提供程序(服务集成总线)支持 createQueue 和 createTopic 方法的大部分有效的特定于 MA88 的字符串参数。
- 缺省队列管理器
- 队列的 MA88 URI 包含队列管理器名称;例如:
queue://qm/queue
要指定缺省队列管理器,请忽略队列管理器名称;例如:queue:///queue(注意,此处为三个正斜杠字符 ///)。因为缺省队列管理器的解释在逻辑上与当前总线上的队列的概念一致,因此,总线允许在 queue: 前缀后出现三个正斜杠字符。 这可使缺省队列管理器的 MA88 队列 URI 由总线使用,无需进行更改。
- 非缺省队列管理器
- 如果 MA88 队列 URI 指定非缺省队列管理器,如 queue://qm/queue 中,那么这会造成总线中出现歧义解释。要突出潜在问题,确保移植过程期间考虑目标,如果此类 URI 传递给 createQueue() 方法,那么会生成 JMSException。
- MA88 属性
- 对于总线 URI,通过指定目标属性,MA88 URI 可包含多个名称值对。许多 MA88 特定属性在总线中不具有直接等效属性,会静默忽略。
但是,以下 MA88 属性会映射到总线等效属性:
MA88 名称 服务器集成总线名称 注释 到期 timeToLive 持久性 deliveryMode 1 = 非持久
2 = 持久
任何其他值 = 应用程序
主题通配符转换
用于使用消息的主题可包含通配符。MA88 中使用的通配符语法与总线中使用的 XPath 语法不同,因此,如果 MA88 URI 包含通配符,那么总线会尝试将其转换为等效于 XPath 的语法。执行的转换基于 MA88 URI 中的 brokerVersion 属性的存在性。 WebSphere Application Server V5.1 缺省消息传递提供程序要求指定主题通配符的任何 URI 在名称-值对中包含 brokerVersion=1。因此,总线将 brokerVersion=1 用作触发器来执行 MQSI 到 XPath 的通配符转换。
区分大小写
createQueue 和 createTopic 的字符串参数的所有部分都区分大小写。
相同属性的多个实例
如果 URI 包含具有冲突值的给定属性的多个实例,那么不会指定使用哪个值。
冲突的 MA88 和总线属性
如果 URI 包含某个属性和具有冲突值的该属性的 MA88 等效属性,那么不会指定使用哪个值。
未知属性
未识别其属性名的任何名称-值对会忽略,且不会报告任何错误。
对特殊字符进行转义
- :(冒号)
- 它用作短格式主题字符串中主题空间和主题之间的分隔符
- ? (问号)
- 它用于指示名称-值对的开始。
- &(& 符号)
- 它用于分隔多个名称-值对。
createTopic("myTop\\:ic") creates a topic with the name "myTop:ic"
createTopic("topic://my\\?Topi\\\\c") creates a topic with the name "my?Topi\c"
createQueue("queue://q1?busName=silly\\&bus") creates a queue with bus name "silly&bus"