0

2 つのサーブレット間で単純な VM キュー テストをセットアップしようとしていますが、成功しません。問題は、予想される時間枠内に応答、OUT メッセージがないため、要求が常にタイムアウトすることです。

「org.apache.camel.ExchangeTimedOutException: OUT メッセージが 30000 ミリ秒以内に受信されませんでした。」

サーブレットは Tomcat で実行され、両方とも Apache Camel をデプロイしています。どちらのアプリもキャメル コンテキストと単純なルートを定義しています。次のような単純なルートが機能しているため、基本的なセットアップは問題ありません。

<route>
  <from uri="servlet:///hello?servletName=app1" />
    <transform>
      <simple>Hello world</simple>
    </transform>
</route>

<route>
  <from uri="servlet:///hello?servletName=app2" />
    <transform>
      <simple>Hello world</simple>
    </transform>
</route>

まず、要求されたルートが定義されていなくても同じタイムアウトが発生するため、メッセージが app2 に到達するかどうかはわかりません (app2 には VM ルートがありません)。したがって、VM キューを使用して 2 つのサーブレット間のルートを定義する方法に問題がある可能性があります。

サーブレット間のルートに問題がない場合、問題は応答がないか正しくないことにあるはずです。Web サーバーからの着信要求が inOut タイプであるため、受信側が応答を返す必要があることは理解していますが、それを達成する方法がわかりません。

web リクエストを受信する app1 のルート:

<route>
  <from uri="servlet:///test?servletName=app1" />
  <to uri="vm:test">
</route>

サーブレット app2 のもう一方の端:

<route>
  <from uri="vm:test" />
// Tested here: output with <simple>, 'To', 'inOut'... the result is always timeout
</route>

私は Apache Camel を初めて使用するので、根本的な原因はおそらく非常に単純です。どんな助けでも大歓迎です。

問題は、2 つのサーブレット アプリ間で VM キューを設定する方法です。

4

1 に答える 1

1

vm コンポーネントは同じクラスローダーで動作します

このコンポーネントは、VM が CamelContext インスタンス間の通信をサポートするという点で SEDA コンポーネントとは異なります。そのため、このメカニズムを使用して Web アプリケーション間で通信できます (camel-core.jar がシステム/ブート クラスパスにある場合)。

したがって、Apache Tomcat を使用する場合は、共有 JAR として camel-core JAR が必要です。どこかのブートクラスパスなど。

于 2013-04-30T14:32:43.140 に答える