我正在测试使用Apache CXF构建的SOAP over JMS Web服务。特别是,我正在关注"jms_specs_demo":一个WSDL-fist示例,描述了消费者需要的调用,SOAP服务实现和消息持久性所需的队列。
客户端调用等于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&jndiConnectionFactoryName=ConnectionFactory&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将管理传输并将消息推送到远程队列而无需额外的库。
答案 0 :(得分:0)
简而言之,不,JMS API本身就是这样 - 一个定义JMS对象必须履行的合同的API。请参阅javadoc for the JMS API。
要实际使用JMS,您的客户端需要使用JMS API的具体实现(称为JMS提供程序),这是您使用activemq-broker库所做的。