【发布时间】:2011-04-25 14:43:52
【问题描述】:
有谁知道编写通用 JMS 客户端是否可行 - 即。与来自不同供应商(例如 Sonic、IBM SIB、Jboss 等)的 JMS 一起使用的一种?
每次我编写 JMS 客户端代码时,它总是非常依赖于依赖 JAR 和上下文类的实现。
谢谢。
【问题讨论】:
有谁知道编写通用 JMS 客户端是否可行 - 即。与来自不同供应商(例如 Sonic、IBM SIB、Jboss 等)的 JMS 一起使用的一种?
每次我编写 JMS 客户端代码时,它总是非常依赖于依赖 JAR 和上下文类的实现。
谢谢。
【问题讨论】:
嗯,一个最佳实践(至少对我来说)是使用非参数 InitialContext constructor 并将提供者特定的东西(如初始上下文工厂和提供者 url)放在类的 jndi.properties 文件中路径而不是硬编码这些东西。您还需要将“正确的”JMS 提供程序 JAR 放在类路径上。
换句话说,您可以拥有通用代码,但您仍然需要配置运行时环境(除非您在像 Spring 这样的容器中运行客户端代码)。
【讨论】:
已经有 2 个很好的答案,但我想补充一点解释。 JMS 是一个 API 标准,它没有定义到服务器的有线协议。因此,所有 JMS 实现都有不同的有线协议——因此您总是需要特定于供应商的 JAR。创建与所有 JMS 提供者兼容的 JMS 客户端库是不可能的。
在您的源代码中,您应该避免使用特定于供应商的功能(例如,TIBCO EMS 允许您使用非 JNDI、本地名称访问目标,并且它具有自定义确认模式)。如果您总是使用 JNDI 查找,那么只有 JNDI URL 和初始上下文工厂名称将特定于服务器类型。
【讨论】:
这就是Spring 的用途。您将拥有特定于供应商的实现,但代码应该相同。参见Spring 3.0 Reference 的19.6 JMS 和21. JMS (Java Message Service)。
【讨论】:
对于将来寻找通用客户端的任何人,请尝试使用主要 JMS 提供程序(ActiveMQ、WebSphere MQ 等)的插件随附的 HermesJMS
【讨论】: