来自 Java SE 的 JMS 连接

问题描述 投票:0回答:1

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

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

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

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

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

java jms spring-jms
1个回答
1
投票

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

任何 JMS 实现还应该提供可以插入到您的应用程序中的 JNDI 实现。通常,这是通过在类路径上放置一个名为

jndi.properties

 的文件并将您正在使用的任何 JNDI 实现的正确配置放入该文件来完成的。当您创建空的 
InitialContext
 时,类路径上的 
jndi.properties
 文件会自动读取。 
jndi.properties
 中的键=值对被放入 
InitialContext
 中,以便当您执行查找时,所有内容都适用于您选择的实现。如果您愿意,您还可以通过 
构造函数
InitialContext 提供特定于实现的详细信息,以编程方式进行配置。

通过在 Java SE 应用程序中使用 JMS 和 JNDI API,并将特定于代理的连接详细信息外部化到您的

jndi.properties

 文件中,您可以有效地将应用程序与特定于代理的代码隔离开来,以便您可以部署应用程序并与不同的代理一起使用对属性文件进行一些简单的更改。

JNDI 客户端实现将来自提供 JMS 实现的人。 JNDI 客户端本质上以打包在 jar 中的

javax.naming.spi.InitialContextFactory

 实现的形式出现,并且通常有描述可用属性的文档。

以下是一些示例:

    ActiveMQ“经典”5.x 代理在其
  • org.apache.activemq.jndi.ActiveMQInitialContextFactory
     中提供了 
    activemq-client-<version>.jar
    。文档可在
    此处获取。
  • ActiveMQ Artemis 代理在其
  • org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
     中提供了 
    artemis-jms-client-<version>.jar
    。文档可在
    此处获取。
需要明确的是,JMS 规范并不

要求使用 JNDI 来查找管理对象,但它建立了 JMS 提供者将这样做的约定期望。 JMS 1.1 规范第 4.2 节指出:

尽管管理对象的接口并不显式依赖于 JNDI,但 JMS 建立了这样的约定:JMS 客户端通过使用 JNDI 在命名空间中查找它们来找到它们。

后来又说:

JMS 提供程序将提供管理员在 JNDI 名称空间中创建和配置受管理对象所需的工具。联合管理系统 受管理对象的提供程序实现应该同时是 javax.naming.Referenceable 和 java.io.Serialized,以便它们可以存储在所有 JNDI 命名上下文中。

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

如果您遇到不提供 JNDI 实现的提供程序,您可以按照

ActiveMQ "Classic" 5.xActiveMQ ArtemisQpid JMS 使用的相同模式实现自己的实现。这 3 个实现仅在客户端,并且只是根据提供给 InitialContext

 的配置实例化管理对象。大多数代码都是样板代码,而不是非常简单的。

© www.soinside.com 2019 - 2024. All rights reserved.