2012-07-31 44 views
2

我需要使用弹簧集成来实现Web服务客户端(以及之后的Web服务服务器)。我已经与春季整合团队提供的样本一起工作过。该实现使用HTTP作为传输层。客户端发出HTTP请求,服务器发回HTTP响应。我不想使用HTTP,而是使用JMS作为传输层。在这种情况下,客户端向队列发送一个SOAP-Request(服务器正在监听该队列),并在发送它时创建一个临时队列并将其设置在JMS消息头中的RepyTo中。服务器获取来自Queue进程的请求,然后使用ReplyTo队列发回SOAP-Response。我知道我们可以使用spring-ws和spring-jms库来完成它。我想使用ws和jms的spring-integration支持:与JMS一起使用弹簧集成Web服务网关

客户端发送请求:java对象 - > SOAP消息 - > JMS消息(有效载荷是SOAP xml) 服务器接收请求:JMS消息是SOAP xml) - > SOAP消息 - > java对象 服务器回发响应:java对象 - > SOAP消息 - > JMS消息(有效载荷是SOAP xml)

例如,我为webservice客户端我现在正在尝试。你能检查我失踪的东西吗?

<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&amp;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 

回答

3

问题解决了:)这里是解决方案:

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)在spring xml文件中为这个目标提供者添加一个bean,并在ws中使用该bean:出站网关

<bean id="jmsDestinationProvider" class="play.zahid.springint.activemq.ws.JmsDestinationProvider"> 
    <property name="jmsUri" value="jms:test_queue?messageType=TEXT_MESSAGE&amp;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" />