1

次のように、cxfコンポーネントを使用してラクダからWebサービスを利用しようとしています。

<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"});
}

そして、最初の呼び出し(つまり、メッセージがサーバーに到着する)の効果が表示されていますが、2番目の呼び出しは表示されておらず、メソッドの実行が終了していません(ここでも、ある時点でタイムアウトになると想定しています) ...もしそうなら、タイムアウトはかなり長いです:私はこれを書き始めたときにテストを実行しました、そしてそれはまだ実行中です)。

私は何かが足りないのですか?バグですか?応答のないWebサービスメソッドを使用するのは悪い習慣ですか?

ちなみに、応答のあるメソッドをテストする場合は問題なく動作します。

4

2 に答える 2

2

Willem Jiangは最近、Camelの片道CXFに関するいくつかの問題を最近修正したと思います。たぶん、トランクからキャメル2.6-SNAPSHOTを試してみてください。

私は個人的にWebサービスとの双方向を好みます。返されるデータがない場合に備えて、ACKを返すだけです。クライアントは、ほとんどの場合、サーバーがデータを受信して​​確認したことを確認する必要があります。

于 2010-12-18T09:19:49.013 に答える
1

camel-cxfプロデューサーは、操作が一方向であるかどうかを確認することにより、応答メッセージを処理するかどうかを決定します。sendMessage操作が一方向の呼び出しであっても、サーバーはHTTPプロトコルに従ってHttp状態202メッセージをクライアントに送信する必要があります。そうしないと、camel-cxfプロデューサーは応答を待機します。

ところで、Clausが言った問題[1]は、一方向のメッセージを伴うラクダ-cxfプロデューサーの非同期呼び出しに関連していると思います。それがあなたが言及したのと同じ問題であるかどうかはわかりません(どのバージョンのラクダを使用しているかわかりませんでした) )。

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

ウィレム

于 2011-03-05T14:05:54.987 に答える