我可以创建 SOAP/JMS 服务而不强制消费者添加 MQ 制造商的库吗?

Can I create a SOAP/JMS service without forcing the consumer to add the MQ maker's library?

我正在测试使用 Apache CXF 构建的基于 JMS Web 服务的 SOAP。特别是,我正在关注 "jms_specs_demo":描述消费者所需调用、SOAP 服务实现和消息持久化所需的队列的 WSDL-fist 示例。

客户端调用等同于 SOAP over HTTP 调用(端点在 WSDL 文件中)。但是,JMS JNDI 地址使用了 MQ 制造商的库(org.apache.activemq.jndi.ActiveMQInitialContextFactory),并且在客户端上也需要它:

<soap:address location="jms:jndi:dynamicQueues/test.cxf.jmstransport.queue?jndiInitialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;jndiConnectionFactoryName=ConnectionFactory&amp;jndiURL=tcp://localhost:61616"/>

我已经建立了一个独立的客户端来测试它:

JMSGreeterService service = new JMSGreeterService();
JMSGreeterPortType greeter = service.getGreeterPort();

greeter.greetMeOneWay("hello World");

但实际上,此代码仅在添加 ApacheMQ 依赖项后才有效:

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-broker</artifactId>
    <version>5.13.3</version>
</dependency>

有没有什么方法可以创建 SOAP over JMS 服务而无需在消费者上添加 MQ 制造商库 (JAR)?我认为 JMS API 可以管理传输并将消息推送到远程队列而无需额外的库。

简而言之,不。JMS API 本身就是一个 API,它定义了 JMS 对象必须满足的契约。见 javadoc for the JMS API.

要实际使用 JMS,您的客户端需要使用 JMS 的具体实现 API(称为 JMS 提供程序),这就是您使用 activemq-broker 库所做的事情。