Apache Camel Конечная точка для прямого маршрута "Отсутствие потребителей в конечной точке"

Я хочу использовать 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]

Если я вместо этого введу прямо в конечную точку Twitter из bean, он отлично работает. Однако, чтобы облегчить тестирование, упростить конфигурацию и т.д., Я хотел бы сохранить фактическую конфигурацию 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), но только что сработала. На этот раз, однако, я хотел бы на самом деле понять, в чем проблема! Любая помощь с благодарностью получена, спасибо.

Ответ 1

Это звучит как проблема с порядком запуска ваших маршрутов. Подробнее здесь http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.html

Вы можете настроить "прямой" маршрут для запуска до другого маршрута, затем эту проблему следует решить.

Ответ 2

Согласно вашей настройке, она также может зависеть от CamelContext, которую вы выбрали. Я получил то же сообщение об ошибке, потому что я отправлял сообщения по маршруту, который существовал в другом CamelContext, чем тот, который я использовал.

(Хотя предыдущий ответ уже был принят, это может быть рабочим решением для других людей, которые ищут это сообщение об ошибке.)

Ответ 3

Для других, приходящих сюда, эта ошибка также может быть вызвана ошибкой OSGI для зависимостей, которые не были развернуты.

Ответ 4

Немного поздно для вечеринки, но эта ошибка произошла со мной, когда у меня было два отдельных файла чертежа: один для обычного запуска и один для теста. В моем тесте я имел в виду тестовый план, но заметил, что нормальный также был автоматически запущен, что вызвало ошибки.

В документации http://camel.apache.org/blueprint-testing.html говорится, что вы можете отключить определенные пучки от запуска. Это помогло мне в моем случае.

Ответ 5

Это также может быть вызвано наличием. в названии маршрута. Замена my.Route.Name на myRouteName проблему для меня.