gpt4 book ai didi

spring-ws - 将 Spring Integration Web 服务网关与 JMS 结合使用

转载 作者:行者123 更新时间:2023-12-01 12:51:56 25 4
gpt4 key购买 nike

我需要使用 spring-integration 实现一个 web 服务客户端(然后是一个 web 服务服务器)。我已经使用了 spring-integration 团队提供的示例。该实现使用 HTTP 作为传输层。客户端发出 HTTP 请求,服务器发回 HTTP 响应。我不想使用 HTTP,而是使用 JMS 作为传输层。在这种情况下,客户端将 SOAP 请求发送到队列(服务器正在监听此队列),并且在发送它时还会创建一个临时队列并将其设置在 JMS 消息 header 的 RepyTo 中。服务器从 Queue 处理它接收请求,然后使用 ReplyTo 队列发回 SOAP-Response。我知道我们可以使用 spring-ws 和 spring-jms 库来做到这一点。我想使用对 ws 和 jms 的 spring-integration 支持来做到这一点:

客户端发送请求:java object -> Soap Message -> JMS message (payload 是 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&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) 为您的 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:outbound-gateway 中使用该 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" />

关于spring-ws - 将 Spring Integration Web 服务网关与 JMS 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11747159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com