我需要使用spring集成实现一个webservice客户端(以及之后的webservice服务器)。我已经使用了spring集成团队提供的样本。该实现使用HTTP作为传输层。客户端正在发出HTTP请求,服务器正在发回HTTP响应。我希望使用JMS作为传输层,而不是使用HTTP。在这种情况下,客户端向队列发送SOAP请求(服务器正在侦听此队列),在发送时还会创建一个临时队列,并在JMS消息头的RepyTo中设置该队列。Server gets接收来自Queue进程的请求,然后使用ReplyTo队列发回SOAP响应。我知道我们可以使用spring-ws和spring-jms库来实现这一点。我想使用对ws和jms:的spring集成支持来实现这一点
客户端发送请求:java对象->Soap消息->JMS消息(有效载荷是Soap xml)服务器接收请求:JMS消息(有效负载是SOAP xml)->SOAP消息->java对象服务器发回响应:java对象->Soap消息->JMS消息(有效载荷是Soap xml)
例如,我正在为我现在正在尝试的Web服务客户端提供xml配置。你能检查一下我缺了什么吗?
<bean id="jndiEnvironment" class="java.util.Properties">
<constructor-arg>
<map>
<entry key="java.naming.factory.initial" value="value" />
<entry key="java.naming.provider.url" value="value" />
<entry key="java.naming.security.principal" value="value" />
<entry key="java.naming.security.credentials" value="value" />
</map>
</constructor-arg>
</bean>
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="/my/jndi/name" />
<property name="jndiEnvironment" ref="jndiEnvironment" />
</bean>
<bean id="marshaller" class="org.springframework.oxm.jibx.JibxMarshaller">
<property name="targetClass" value="zahid.play.si.ws.jms.GetCountryDescriptionRequest" />
</bean>
<bean id="destinationResolver"
class="org.springframework.jms.support.destination.JndiDestinationResolver">
<property name="jndiEnvironment" ref="jndiEnvironment" />
</bean>
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" />
<bean id="messageSender" class="org.springframework.ws.transport.jms.JmsMessageSender">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destinationResolver" ref="destinationResolver" />
</bean>
<bean id="messageTemplate" class="org.springframework.integration.core.MessagingTemplate">
<property name="defaultChannel" ref="requestChannel" />
</bean>
<int:channel id="requestChannel" />
<ws:outbound-gateway id="wsClientGateway"
uri="jms:MY.TOPIC?messageType=TEXT_MESSAGE&deliveryMode=NON_PERSISTENT"
message-factory="messageFactory" marshaller="marshaller" unmarshaller="marshaller"
message-sender="messageSender"
request-channel="requestChannel" />
在java代码中,我使用:messagingTemplate.convertSendAndReceive(MessageBuilder.withPayload(request).build())
来发送请求。
但我得到了这个错误:
[jms:MY.TOPIC?messageType=TEXT_MESSAGE&deliveryMode =NON_PERSISTENT] is not a valid HTTP URL
解决了问题:)以下是解决方案:
1) 为Jms Uri:定义目标提供商
public class JmsDestinationProvider implements DestinationProvider {
private String jmsUri;
public URI getDestination() {
if(StringUtils.hasText(jmsUri)){
try {
return new URI(jmsUri);
} catch (URISyntaxException e) {
}
}
return null;
}
public void setJmsUri(String jmsUri) {
this.jmsUri = jmsUri;
}
}
2) 在springxml文件中,为该目标提供程序添加一个bean,并在ws:outboundgateway中使用该bean
<bean id="jmsDestinationProvider" class="play.zahid.springint.activemq.ws.JmsDestinationProvider">
<property name="jmsUri" value="jms:test_queue?messageType=TEXT_MESSAGE&deliveryMode=NON_PERSISTENT" />
</bean>
<ws:outbound-gateway id="wsClientGateway"
destination-provider="jmsDestinationProvider"
message-factory="messageFactory" marshaller="marshaller" unmarshaller="marshaller"
message-sender="messageSender"
request-channel="requestChannel" />