我们的客户端位于基于Extranet的环境中,需要连接到我们的JMS队列。他们应该能够在JNDI空间中查找我们的队列和connectionFactories吗? 我的意思是推荐和可扩展的方法是什么......
答案 0 :(得分:0)
在初始化期间,客户端应用程序需要访问ConnectionFactory
和Destination
({1}}和Queue
)对象的基本类型。总的来说,这些类型称为受管对象,JMS规范声明它们应该实现Topic
和javax.naming.Referenceable
接口。
这意味着您不仅可以通过命名服务,还可以通过其他机制将管理对象提供给客户端。例如,您可以序列化受管理对象并将其存储在文件中,将序列化对象作为电子邮件附件传输,在Web / FTP服务器上提供java.io.Serializable
(Java序列化对象)文件,等等。如果您对外联网客户的关注是他们不知道您的内部命名服务的联系方式,这种方法可能会有用。
但这并没有真正回答你的问题哪个是使JMS客户端可以使用管理对象的最佳技术?命名服务?共享文件系统上的序列化对象文件?网络或FTP服务器?一个数据库?答案是没有“普遍最佳”的方式。一些组织将标准化使用一种技术,而其他组织则倾向于使用另一种技术。如果您正在编写将在许多组织中使用的JMS客户端,那么您可以使客户端灵活地访问受管理对象。您可以通过实现具有以下签名的方法来执行此操作:
.jso
该方法的实现应该查看public Object importObject(String instructions);
的开头,以确定应该使用哪种技术来检索对象。例如:
instructions
(实际上,应该从命令行参数或配置文件中获取指令,而不是硬编码到应用程序中。)
上面显示的obj1 = importObject("naming#path/in/naming/service");
obj2 = importObject("file#path/to/file.jso");
obj3 = importObject("exec#command to execute");
变体可以执行任意shell命令,该命令可以从Web或FTP服务器(可能使用curl),数据库中检索"exec#..."
文件或者对用户来说最方便的东西。多年前,我为另一种中间件技术(CORBA)编写了类似的实用函数,并且它提供的灵活性被证明是非常有用。您可以阅读一些关于我的CORBA实用程序函数here。
要注意的另一个问题(以及@skaffman在评论中提到的一个问题)是,尽管JMS规范定义了API,但不定义了线上协议。因此,不同的JMS产品之间通常没有互操作性。因此,如果您的公司内部JMS应用程序是使用产品X构建的,那么公司外部JMS客户端也需要使用产品X构建。尽管如此,一些供应商可能会销售一个可以通过以下方式接收传入消息的“桥接器”产品X使用的线上协议,然后使用产品Y的线上协议重新传输消息。这是提供不同JMS产品之间互操作性的一种方法。
免责声明:不要让这个答案的冗长让你误以为我是JMS专家。我实际上使用JMS的经验非常有限,所以如果有人添加评论说我的建议存在缺陷,那么它们可能是正确的。