java - 来自 Java SE 的 JMS 连接

标签 java jms spring-jms

我想以与代理无关的方式从 Java SE 应用程序创建 JMS 连接。

我正在将 JDBC 与数据库连接的 URL 方案进行比较。这创造了与实际实现的独立性。

对于 JMS,我还没有找到类似的东西。我知道在 Java EE 中 JNDI 将扮演这个角色,但这是 Java SE。

我不想将我的代码绑定(bind)到任何特定的队列代理,因为我的需求非常简单 JMS 1.1 发送/接收文本消息。

我也研究过 Spring Boot,因为它通常擅长提供某种程度的不可知论。但即使使用 Spring Boot,我也看不到这种可能性。

最佳答案

JNDI 是您编写 JMS 应用程序以与代理无关的方式进行连接的方式。 JNDI 客户端类是 Java SE 的一部分。 Spring 和非 Spring Java SE 应用程序都使用 JNDI 进行这种集成。

任何 JMS 实现还应该提供可以插入到您的应用程序中的 JNDI 实现。通常,这是通过放置名为 jndi.properties 的文件来完成的。在您的类路径中,并将您正在使用的任何 JNDI 实现的正确配置放入该文件中。当您创建空 InitialContext jndi.properties类路径上的文件会自动读取。 jndi.properties 中的键=值对放入 InitialContext这样当您执行查找时,一切都会与您选择的实现配合使用。如果您愿意,您还可以通过向 InitialContext 提供实现特定详细信息来以编程方式配置此功能。通过a constructor .

通过在 Java SE 应用程序中使用 JMS 和 JNDI API,并将特定于代理的连接详细信息外部化到您的 jndi.properties通过文件,您可以有效地将您的应用程序与特定于代理的代码隔离开来,这样您就可以通过在属性文件中进行一些简单的更改来部署您的应用程序并与不同的代理一起使用。

JNDI 客户端实现将来自提供 JMS 实现的人。 JNDI 客户端本质上以 javax.naming.spi.InitialContextFactory 的形式出现。实现打包在 jar 中,并且通常有描述可用属性的文档。

以下是一些示例:

  • ActiveMQ 5.x 代理提供 org.apache.activemq.jndi.ActiveMQInitialContextFactory可以在他们的 activemq-client-<version>.jar 中找到。文档可用 here .
  • ActiveMQ Artemis 代理提供 org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory可以在他们的 artemis-jms-client-<version>.jar 中找到。文档可用 here .

需要明确的是,JMS 规范并不要求使用 JNDI 来查找管理对象,但它建立了约定期望 JMS 提供商会这样做。 JMS 1.1 规范第 4.2 节指出:

Although the interfaces for administered objects do not explicitly depend on JNDI, JMS establishes the convention that JMS clients find them by looking them up in a namespace using JNDI.

然后它说:

It is expected that JMS providers will provide the tools an administrator needs to create and configure administered objects in a JNDI namespace. JMS provider implementations of administered objects should be both javax.naming.Referenceable and java.io.Serializable so that they can be stored in all JNDI naming contexts.

根据我的经验,JMS 提供商通常渴望提供 JNDI 实现,因为没有 JNDI 实现,他们就没有竞争力,因为任何替代解决方案都不符合标准,并且将迫使用户实现不可移植的代码。

如果您遇到不提供 JNDI 实现的提供程序,您可以按照 ActiveMQ 5.x 使用的相同模式实现您自己的实现。 , ActiveMQ Artemis ,和Qpid JMS 。这 3 个实现仅在客户端,并且只是根据提供给 InitialContext 的配置来实例化管理对象。 。大多数代码都是样板代码,而不是非常简单的。

关于java - 来自 Java SE 的 JMS 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56550682/

相关文章:

java - 使用相同 onMessage 的多个 MessageListener 的线程安全性?

java - 无法同步在 main() 中创建的两个线程

java - 基于 SOAP 的 SugarCRM - V2

java - JMS 监听器在服务器启动时设置 Hibernate 之前触发

java - 消息监听器 onMessage() 方法不会从队列中读取消息

java - DefaultMessageListenerContainer,有关要监听的队列的知识

java - 取消选择 JTable 中的选定行

java - Maven war : split classes JAR for different packages

intellij-idea - 使用 IntelliJ 监控 JMS 队列

java - JMS 负载平衡(1 个队列、2 个队列连接工厂和 1 个 .bindings)