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