当前位置: 首页 > 知识库问答 >
问题:

来自Java SE的JMS连接

吴欣然
2023-03-14

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

我用数据库连接的URL方案与JDBC进行比较。这将创建与实际实现无关的独立性。

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

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

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

共有1个答案

马国源
2023-03-14

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

任何JMS实现还应提供可插入应用程序的JNDI实现。通常,这是通过放置一个名为jndi的文件来完成的。属性,并将您正在使用的任何JNDI实现的正确配置放入该文件中。当您创建一个空的初始上下文时,jndi。将自动读取类路径上的属性文件。jndi中的键=值对。属性被放入初始上下文中,以便在执行查找时,所有内容都与您选择的实现一起工作。如果愿意,还可以通过构造函数向InitialContext提供特定于实现的详细信息,以编程方式对此进行配置。

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

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

以下是一些示例:

  • ActiveMQ 5。x broker提供组织。阿帕奇。activemq。jndi。ActiveMQInitialContextFactory在其activemq客户端中可用-

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

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

后来它说:

预计JMS提供程序将提供管理员在JNDI命名空间中创建和配置受管对象所需的工具。受管理对象的JMS提供程序实现应该都是javax。命名。可引用和java。io。可序列化,以便它们可以存储在所有JNDI命名上下文中。

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

如果遇到不提供JNDI实现的提供程序,可以按照ActiveMQ 5使用的相同模式实现自己的提供程序。x、 ActiveMQ Artemis和Qpid JMS。这3个实现仅为客户端实现,仅根据提供给InitialContext的配置实例化管理对象。大部分代码都是锅炉板,而不是很直接。

 类似资料:
  • 我已经看到了一两个关于堆栈溢出的问题,但是我仍然无法解决它,所以我想提出我自己的问题。 一和二 要为JMS应用程序编译和运行WebSphere MQ类,请为您的平台使用CLASSPATH设置,如表1所示。 classpath=mq_installation_path\java\lib\com.ibm.mqjms.jar;mq_installation_path\tools\jms; 我试过了,但它

  • 有一个请求队列,回复队列由客户端服务器实例创建,并固定到每个实例,而不是使用临时队列。 用例需要获取入站jms消息,然后将该消息发送到异步进程。一旦从服务接收到异步回复消息,我需要获取这些结果并回复原始消息的jmsReplyTo。Jms网关在这种情况下不起作用AFAIK 我正在使用jms消息驱动的通道适配器来处理带有一系列通道和服务激活器的消息,以处理进程外调用和异步回复。我正在尝试使用Dynam

  • 因此,我想知道什么是处理数据库连接问题的最佳方法?每次调用Lambda函数时,我都被迫建立新的连接,还是有办法将这些连接池起来/缓存起来,以便进行更高效的查询? 多谢了。

  • 我试图在Wildfly(版本24)和远程ActiveMQ Artemis代理中实现简单的JMS生产者和消费者。 独立的。xml 生产者和消费者 Misc:只有制片人才能工作。 结果:代理收到第一条消息,但没有执行消费,也没有发生任何事情(没有日志)。

  • 假设有一个具有以下结构的基本SQL db: 客户ID 姓名 邮编 电子邮件 订单ID 客户ID 描述 项目ID 订单ID 名称 成本 所以一个客户可以有很多订单,一个订单可以有很多项目。 要运行什么最合适的LINQ查询来实现以下结果,其中订单项名称结果是逗号分隔的字符串: 客户名称|客户电子邮件|订单项目名称 因此,订单表实际上就像客户和订单项表之间的链接表。然后,我想将与所有订单关联的所有项目的

  • 大家好 我的nginx服务器有问题。我已将nginx配置为保持活动连接。 保持活力; 并连接到服务器与持久连接,我发送许多请求到服务器在同一连接。 我想从php关闭持久连接。php退出和死命令关闭响应,而不是连接。客户端可以在同一连接中重新发送到服务器请求。 简单地说,我想关闭从php的持久连接 我用这个命令, 标题(“连接:关闭”); 但未受影响,连接仍然存在 如何从php关闭http连接