2 个 JMS 提供者必须持有彼此的上下文类才能进行通信吗?
我们将从一个实际的例子开始,然后返回概念性问题。
我使用 Weblogic (10.3) 作为我的应用程序服务器。我希望我的应用程序具有 JMS 功能,并决定让它使用 Weblogic 作为 JMS/MOM 提供的功能。我在 Weblogic 中设置了一个队列,并在代码中创建了一个 MDB 类。
现在我想向 Weblgic 队列发送一条消息。我使用 openJMS 客户端。它要求我将 weblogic jar 文件包含在其类路径中,以便向 weblogic 发送消息。
当我设置 Weblogic 以将消息发送到 openJMS 队列时 - 我使用了外部目标 - 它抛出类未找到异常,直到我将 openJMS jar 放入 weblogic 类路径中。
这是因为我看到的所有 JMS 通信示例都使用 JNDI 上下文来获取连接工厂。
我的问题是:这有意义吗? JMS 不应该是某种中立的通信协议吗?这意味着我无法决定在运行时发送到哪个 JMS 提供程序,因为我的类路径中没有它的上下文类?
或者我只是错过了设置中的某些内容?
是否有另一种方法来准备与远程提供商的连接工厂?
We'll start with a down-to-earth example and then return the coneptual question.
I am using Weblogic (10.3) as my Application Server. I want my application to have JMS capabilities and decided to let it use the Weblogic as the JMS / MOM provide. I setup a Queue in Weblogic and created an MDB class in my code.
Now I want to send a message to Weblgic queue. I used openJMS client. It required me to include the weblogic jar file in its classpath in order to send a message to weblogic.
And the same when I setup Weblogic to send message to the openJMS queue - I used Foreign Destination - it threw class not found exception until I placed openJMS jars in weblogic classpath.
This is becasue all JMS communication examples I saw use JNDI context to get the connection factory.
My question is: does that make sense? Isn't JMS suppose to be some neutral communication protocol? Meaning I can't decide to which JMS provider I am sending, at run-time, because I won't have its context classes in my classpath?
Or did I simply miss something in the setup?
Is there another way to preapre the connection factory to the remote provider?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好问题。答案是:不是。 JMS 只是定义如何连接队列/主题并向其发送消息的 API。它不是一个协议,因此 JMS 提供程序实现可以自由地使用它们自己的内部消息格式 — 这就是您需要导入提供程序的 jar 的原因。而且您也不能期望提供者 A 能够与提供者 B 交换消息,除非两个提供者都明确给出了这种可能性。
开放的跨平台消息通信协议是 AMQP。还有其他商业解决方案,例如 IBM Websphere MQ。
Good question. The answer is: it isn't. JMS is only the API that defines how to connect and send messages to queues/topics. It is not a protocol, so JMS provider implementations are free to use their own internal message format — that's why you need to import the jars of the provider. And also you can't expect provider A to be able to exchange messages with provider B, unless both providers give such possibility explicitly.
An open, cross platform messaging communication protocol is AMQP. There are also other commercial solutions, for example IBM Websphere MQ.