1

我正在尝试使用 cxf 组件从骆驼消费网络服务,如下所示:

<cxf:cxfEndpoint id="webservice"
                 address="http://webservice.url.com/webservice"
                 serviceClass="com.url.webservice.MyWebService"/>

<camel:camelContext>
    <camel:route>
        <camel:from uri="direct:a"/>
        <camel:inOnly uri="cxf:bean:webservice?defaultOperationName=sendMessage"/>
    </camel:route>
</camel:camelContext>

sendMessage方法没有响应,因此inOnly而不是to(尽管我尝试to替代时遇到了同样的问题)。问题是骆驼显然仍然希望得到响应,并且路由在等待响应时挂起。我想如果我让它尝试足够长的时间,它最终会超时。

为了清楚起见,我正在运行一个测试方法:

/* ... */

@Produce(uri = "direct:a")
protected ProducerTemplate directA;

@Test
public void sendMessage() throws Exception {
    directA.sendBody(new String[] {"client id", "message"});
    directB.sendBody(new String[] {"client id", "message 2"});
}

我看到了第一个调用的效果(即消息到达服务器),但不是第二个,并且该方法没有完成运行(再次,我假设它会在某个时候超时...如果是这样,超时时间很长:我在开始写这篇文章时运行了测试,它仍在运行)。

我错过了什么吗?它是一个错误吗?拥有没有响应的 Web 服务方法只是不好的做法吗?

顺便说一句,当测试有响应的方法时,它工作正常。

4

2 回答 2

2

我认为 Willem Jiang 最近解决了 Camel 中单向 CXF 的一些问题。也许从主干尝试 Camel 2.6-SNAPSHOT。

我个人更喜欢使用 Web 服务的双向方式,只返回一些 ACK,以防没有数据返回。客户端通常需要一些确认服务器已接收并确认数据。

于 2010-12-18T09:19:49.013 回答
1

camel-cxf 生产者通过检查操作是否单向来决定是否处理响应消息。即使 sendMessage 操作是单向调用,您的服务器也应该根据 HTTP 协议向客户端发送 Http states 202 消息,否则 camel-cxf producer 仍将等待响应。

顺便说一句,我认为克劳斯所说的问题[1]与使用单向消息异步调用 camel-cxf 生产者有关,不确定是否与您提到的问题相同(我不知道您使用的是哪个版本的骆驼)。

[1]https://issues.apache.org/jira/browse/CAMEL-3426

威廉

于 2011-03-05T14:05:54.987 回答