通用JMS客户端

问题描述:

有谁知道是否可行写一个通用JMS客户端 - 即。一个与来自不同提供商(例如Sonic,IBM SIB,Jboss等)的JMS一起工作?通用JMS客户端

每次我编写JMS客户端代码时,它总是对依赖于JAR和Context类的实现特定的。

谢谢。

那么,一个最佳实践(至少对我来说)是使用非参数InitialContext constructor并将提供程序特定的东西(如初始上下文工厂和提供程序url)放在类路径中的jndi.properties文件中,而不是硬编码这些东西。您还需要将“正确”的JMS提供程序JAR放在类路径中。 换句话说,你可以有通用的代码,但你仍然需要配置运行时环境(除非你在像Spring这样的容器中运行你的客户端代码)。

这是Spring的用途。你将有供应商特定的实现,但代码应该是相同的。请参阅Spring 3.0 Reference19.6 JMS21. JMS (Java Message Service)

2个很好的答案,但我想补充一点解释。 JMS是一个API标准,它没有定义服务器的有线协议。因此,所有JMS实现都有不同的有线协议 - 因此,您将始终需要特定于供应商的JAR。创建与所有JMS提供者兼容的JMS客户端库是不可能的。
在您的源代码中,您应该避免使用特定于供应商的功能(例如,TIBCO EMS允许您访问具有非JNDI的本地名称,并且具有自定义确认模式)。如果您始终使用JNDI查找,那么只有JNDI URL和初始上下文工厂名称将特定于服务器类型。

对于任何在将来寻找通用客户端的人,请尝试使用主要JMS提供者(ActiveMQ,WebSphere MQ等)的插件附带的HermesJMS