使用Spring集成Web服务网关和JMS

时间:2012-07-31 19:03:17

标签: spring-ws spring-integration spring-jms

我需要使用spring-integration实现webservice客户端(以及之后的web服务服务器)。我已经使用过spring-integration团队提供的样本。该实现使用HTTP作为传输层。客户端发出HTTP请求,服务器发回HTTP响应。我不想使用HTTP,而是希望将JMS用作传输层。在这种情况下,客户端将SOAP-Request发送到队列(服务器正在侦听此队列),并且在发送它时也会创建一个临时队列,并在JMS消息头中的RepyTo中设置该队列。服务器从Queue进程接收请求,然后使用ReplyTo队列发回SOAP响应。我知道我们可以使用spring-ws和spring-jms库来实现。我想使用对ws和jms的spring-integration支持来实现它:

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

例如,我正在为我正在尝试的webservice客户端提供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&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 

1 个答案:

答案 0 :(得分:4)

解决了问题:)以下是解决方案:

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:outbound-gateway

<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" />