当前位置: 首页 > 知识库问答 >
问题:

Apache Camel-Spring Web服务SpringWebservicesConsumer不会从中读取答案

商开宇
2023-03-14

我使用Camel spring-ws组件通过在路由的“from”部分指定SOAP web服务来公开它。

碰巧的是,在路由逻辑的末尾,Exchange的“out”消息没有填充,但是“in”消息包含所需的响应数据。

如果在生成最终响应时不存在“out”,则生产者组件的默认约定是使用“in”交换消息。

然而,SpringWebservice消费者仅支持最终交换有“out”消息的场景。以下是https://github.com/apache/camel/blob/master/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConsumer.java的代码片段:

public void invoke(MessageContext messageContext) throws Exception {
    Exchange exchange = getEndpoint().createExchange(ExchangePattern.InOptionalOut);
    populateExchangeFromMessageContext(messageContext, exchange);

    // start message processing
    getProcessor().process(exchange);

    if (exchange.getException() != null) {
        throw exchange.getException();
    } else if (exchange.getPattern().isOutCapable()) {
        Message responseMessage = exchange.getOut(Message.class);
        if (responseMessage != null) {
            Source responseBody = responseMessage.getBody(Source.class);
            WebServiceMessage response = messageContext.getResponse();

            configuration.getMessageFilter().filterConsumer(exchange, response);

            XmlConverter xmlConverter = configuration.getXmlConverter();
            xmlConverter.toResult(responseBody, response.getPayloadResult());
        }
    }
}

这会导致不生成对 SOAP 请求的响应。

问题:这是camel-spring ws的bug/限制还是我没有正确使用spring ws消费者?

否则,听起来我必须将交换模式显式设置为InOut?

共有1个答案

孔硕
2023-03-14

在发布CAMEL-10888之前,作为一种变通办法,在路由中,您可以将交换模式设置为InOut,以获取交换的非空“Out”消息:

.setExchangePattern(ExchangePattern.InOut) 
 类似资料:
  • 我在生产环境中使用redis server,在HA中使用redis Sentinel。但是阅读文档,当客户机连接到sentinel时,sentinel将主redis服务器提供给客户机。 是所有的读写操作都在主服务器上进行,而从服务器只用于故障转移,还是我们可以使用从服务器读取数据?

  • 我试图在聚合器完成后获得一个回复,但是我得到一个异常,我没有指定任何聚合器子项,但是当我指定一个。to()endpoint我没有收到聚合结果。。。这可能吗? 控制器: 聚合器:

  • 我正在从sftp服务器读取文件,并使用Spring Batch Framework将该文件加载到数据库中。下面是我的代码,但我遇到了一个错误 代码: 错误:

  • 我使用spring-data-redis(2.1.5.release)和jedis(2.10.2)客户端从作为spring-boot应用程序运行的不同服务连接到我的azure redis实例。 两个服务具有相同的缓存方法,并通过实现以下配置指向相同的缓存。am面临的问题是,当一个服务试图读取另一个服务创建的缓存值时,出现了去序列化异常。 例外情况: 注意:我使用redis只是为了缓存从我的数据库中

  • 我正在尝试从我的ftp服务器读取csv文件。链接看起来像: 然而,d3不喜欢它。 在chrome中,我得到以下错误: 我有大量的数据文件~12GB,ftp服务器是我在线存储数据最方便的方式 有没有办法解决这个问题?

  • 我成功地使用会话在我的服务使用: 然而,我的应用程序是分层的,服务中的一个方法将调用业务层中的另一个方法,然后调用DAO层方法。 在DAO层中,我想访问会话中保存的一些信息。我可以这样看: 在每个方法中传递HttpSession对象。。。但我不想那样做 还有其他方法吗? 我正在使用GUICE获取信息,是否有一些已经创建的提供程序可以为我提供当前请求会话? 谢谢