Apache Camel端点注入直接路由“端点上没有可用的消费者”
Posted
技术标签:
【中文标题】Apache Camel端点注入直接路由“端点上没有可用的消费者”【英文标题】:Apache Camel Endpoint injection to direct route "No consumers available on endpoint" 【发布时间】:2012-11-05 01:39:57 【问题描述】:我想使用 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>
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 功能无关),但刚刚解决了这个问题。但是,这一次,我想真正了解问题所在!感谢您的帮助,谢谢。
【问题讨论】:
【参考方案1】:这也可能是由 .在路线名称中。将my.Route.Name
替换为myRouteName
为我解决了这个问题。
【讨论】:
【参考方案2】:聚会有点晚了,但是当我有两个单独的蓝图文件时发生了这个错误,一个用于正常运行,一个用于测试。在我的测试中,我指的是测试蓝图,但注意到正常的蓝图也自动启动,导致错误。
在文档http://camel.apache.org/blueprint-testing.html 中,它说您可以禁止某些捆绑包启动。这对我有帮助。
【讨论】:
【参考方案3】:对于其他来到这里的人,此错误也可能是由尚未部署的依赖项的 OSGI 错误引起的。
【讨论】:
【参考方案4】:根据您的设置,它还可能取决于您选择的CamelContext
。我收到了同样的错误消息,因为我在另一个 CamelContext
中存在的路由上发送消息,而不是我实际使用的路由。
(虽然之前的答案已被接受,但这可能是其他人搜索该错误消息的有效解决方案。)
【讨论】:
我遇到了类似的问题。我忘记将 @Component 标头添加到 RouteBuilder 类,这意味着 Spring 没有创建该类的实例。【参考方案5】:这听起来像是您的路线启动排序有问题。在此处查看更多详细信息http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.html
您可以将“直接”路由配置为在其他路由之前启动,那么该问题应该得到解决。
【讨论】:
谢谢。我在直接路由中添加了 startupOrder="100",在发送给它的路由中添加了“200”,它运行良好。 在配置路线之前,我正在设置生产者模板并启动骆驼上下文。顺序是配置路由-骆驼上下文启动-生产者模板配置以上是关于Apache Camel端点注入直接路由“端点上没有可用的消费者”的主要内容,如果未能解决你的问题,请参考以下文章
Apache Camel:我是否需要使我的FTP-Consumer路由事务处理?
Apache Camel:“direct:start”端点——这是啥意思?