16

Camelを使用してActiveMQからメッセージを取得し、メッセージの内容(protobuf)に基づいて、1つ以上のメッセージをTwitterに送信したいと思います。ルート内から呼び出され、インジェクションを使用して複数のメッセージを「direct:xyz」エンドポイントに送信するBeanを作成しました。

ただし、Camelは実行時に次のように不平を言っています。

2012-11-16 09:56:33,376 | WARN  | ication.twitter] | DirectProducer                   | 160 - org.apache.camel.camel-core - 2.10.2 | No consumers available on endpoint: Endpoint[direct://twitter] to process: Exchange[Message: hello world]

代わりに、Bean内からTwitterエンドポイントに直接注入すると、正常に機能します。ただし、テストを容易にし、構成を簡素化するために、実際のTwitter構成を分離したままにしておきたいので、別のルートに送信したいと思います。

キャメルコンテキスト設定は次のようになります:-

<camelContext id="NotificationTwitter"
    trace="false" xmlns="http://camel.apache.org/schema/blueprint">
    <dataFormats>
        <protobuf id="notificationProto" instanceClass="org.abc.schemas.protobuf.NotificationDef$NotificationMsg" />
    </dataFormats>

    <route id="TwitterPreparation">
        <from uri="activemq:notification.twitter" />
        <unmarshal ref="notificationProto" />
        <log logName="abc" loggingLevel="INFO"
            message="Twitter request received: ${body}" />
        <bean ref="NotificationTweeter" method="createTweets" />
    </route>

    <route id="Twitter">
        <from uri="direct:twitter" />
        <log logName="abc" loggingLevel="INFO"
            message="Tweeting: ${body}" />
        <to uri="twitter://timeline/user?consumerKey=itsasecret&amp;consumerSecret=itsasecret&amp;accessToken=itsasecret&amp;accessTokenSecret=itsasecret" />
    </route>
</camelContext>

Beanは次のようになります:-

public class NotificationTweeter {

  @EndpointInject(uri = "direct:twitter")
  private ProducerTemplate producerTemplate;

  public void createTweets(NotificationMsg notification) {

    String tweet = notification.getMessageDetail().getTitle();

    try {
      // only send tweets where the notification message contains the Twitter mechanism
      for (MechanismMsg mechanism : notification.getMechanismList()) {
        if (mechanism.getType() == MechanismTypeEnum.TWITTER) {

          // Cycle round the recipients
          for (RecipientMsg recipient : mechanism.getRecipientList()) {
            tweet = "@" + recipient.getIdentifier() + " " + tweet;

            producerTemplate.sendBody(tweet);
          }

          // TODO exceptions if no recipients found, etc
        }
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

私は他のルートでこの問題を抱えていましたが(確かにTwitterの機能とは関係ありません)、問題を回避したばかりです。しかし今回は、実際に何が問題なのかを理解したいと思います!感謝の気持ちを込めて、どんな助けも受けました。

4

5 に答える 5

9

CamelContextセットアップによると、ピックアップしたものにも依存する場合があります。CamelContext実際に使用していたルートとは別のルートに存在するルートでメッセージを送信していたため、同じエラー メッセージが表示されました。

(以前の回答はすでに受け入れられていましたが、これはそのエラーメッセージを探している他の人にとって有効な解決策かもしれません。)

于 2013-11-04T15:14:10.210 に答える
7

ルートの起動順序に問題があるようです。詳細については、http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.htmlを参照してください。

「直接」ルートを他のルートの前に開始するように構成できます。そうすれば、その問題を解決する必要があります。

于 2012-11-18T11:59:45.310 に答える
1

パーティーには少し遅れましたが、通常の実行用とテスト用の 2 つの個別のブループリント ファイルがあるときに、このエラーが発生しました。私のテストでは、テスト ブループリントを参照していましたが、通常のブループリントも自動的に開始され、エラーが発生したことに気付きました。

ドキュメントhttp://camel.apache.org/blueprint-testing.htmlでは、特定のバンドルの起動を無効にできると書かれています。それは私の場合に私を助けました。

于 2016-05-18T08:19:59.763 に答える
0

これは、. ルート名に。my.Route.Name問題をmyRouteName修正したものに置き換えてください。

于 2019-04-03T07:11:15.047 に答える