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&consumerSecret=itsasecret&accessToken=itsasecret&accessTokenSecret=itsasecret" />
</route>
</camelContext>
豆は次のようになります:-
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機能とは関係ありません)が、それを回避しただけです。今回は問題が何なのか、実感したい!助けてくれてありがとう、ありがとう。
ルートの起動順序に問題があるようです。詳細はこちら http://camel.Apache.org/configuring-route-startup-ordering-and-autostartup.html
「直接」ルートを他のルートの前に開始するように構成すると、その問題は解決されます。
設定によっては、選択したCamelContext
によっても異なる場合があります。実際に使用しているルートとは別のCamelContext
に存在するルートにメッセージを送信していたため、同じエラーメッセージが表示されました。
(以前の回答は既に受け入れられていましたが、これはそのエラーメッセージを検索している他の人のための実用的な解決策かもしれません。)
パーティーには少し遅れましたが、通常の実行用とテスト用の2つの別々のブループリントファイルがあると、このエラーが発生しました。テストでは、テストブループリントを参照していましたが、通常のブループリントも自動的に開始され、エラーが発生することに気付きました。
ドキュメントでは http://camel.Apache.org/blueprint-testing.html 特定のバンドルの起動を無効にできると記載されています。それは私の場合に私を助けました。
ここに来る他の人にとって、このエラーは、デプロイされていない依存関係のOSGIエラーが原因である可能性もあります。
これは、。ルート名。置換my.Route.Name
with myRouteName
で問題が解決しました。