我想使用Camel从ActiveMQ接收消息,然后根据消息内容(protobuf)向Twitter发送一条或多条消息。我编写了一个从路由中调用的bean,它使用注入将多个消息发送到“direct:xyz”端点。
然而,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功能没有关系)但是刚刚解决了这个问题。但是,这一次,我想真正了解问题所在!感谢任何帮助,谢谢。
答案 0 :(得分:9)
根据您的设置,它可能还取决于您选择的CamelContext
。我得到了相同的错误消息,因为我在另一个CamelContext
中存在的路由上发送的消息比我实际使用的路径上发送消息。
(虽然之前的答案已被接受,但这可能是其他人搜索该错误消息的有效解决方案。)
答案 1 :(得分:7)
这听起来像是路线启动顺序的问题。点击此处http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.html
了解更多详情您可以配置&#34;直接&#34;路线在另一条路线之前开始,然后该问题应该解决。
答案 2 :(得分:1)
对于其他人来说,此错误也可能是由于尚未部署的依赖项的OSGI错误引起的。
答案 3 :(得分:1)
派对有点晚了,但是当我有两个单独的蓝图文件时,这个错误发生在我身上,一个用于正常运行,另一个用于测试。在我的测试中,我指的是测试蓝图,但注意到正常的测试蓝图也会自动启动而导致错误。
在文档http://camel.apache.org/blueprint-testing.html中,它表示您可以禁用某些捆绑包启动。这对我有帮助。
答案 4 :(得分:0)
这也可能是由引起的。在路线名称中。将my.Route.Name
替换为myRouteName
为我解决了这个问题。