Какая разница между "direct:" и() в Apache Camel?

Документация DirectComponent дает следующий пример:

from("activemq:queue:order.in")
    .to("bean:orderServer?method=validate")
    .to("direct:processOrder");

from("direct:processOrder")
    .to("bean:orderService?method=process")
    .to("activemq:queue:order.out");

Есть ли разница между этим и следующим?

from("activemq:queue:order.in")
    .to("bean:orderServer?method=validate")
    .to("bean:orderService?method=process")
    .to("activemq:queue:order.out");

Я попытался найти документацию о том, что поведение метода to() находится на Java DSL, но вне RouteDefinition javadoc (который дает очень короткое сообщение "Отправляет обмен на данную конечную точку" ). Я пришел в исходное состояние: (

Ответ 1

В этом случае вы не заметите большой разницы. "Прямой" компонент очень похож на вызов метода.

Как только вы начнете строить несколько более сложные маршруты, вы захотите сегментировать их в нескольких разных частях по нескольким причинам.

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

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

// Three endpoints to one "main" route.
from("activemq:queue:order.in")
  .to("direct:processOrder");

from("file:some/file/path")
  .to("direct:processOrder");

from("jetty:http://0.0.0.0/order/in")
  .to("direct:processOrder");

from("direct:processOrder")
  .to("bean:orderService?method=process")
  .to("activemq:queue:order.out");

Другое дело, что один маршрут создается для каждого предложения from() в DSL. Маршрут - это артефакт в Camel, и вы можете выполнять определенные административные задачи по нему с помощью API Camel, такие как запуск, остановка, добавление, удаление маршрутов динамически. Предложение "to" - это всего лишь вызов конечной точки.

Как только вы начнете делать некоторые реальные случаи с некоторой сложностью в Camel, вы заметите, что вы не можете получить слишком много "прямых" маршрутов.

Ответ 2

Прямой компонент используется для обозначения логического сегмента маршрута. Это аналогичный процесс для процедур именования в структурном программировании.

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

Ответ 3

Еще одно отличие заключается в том, что у компонента Direct нет пула потоков, метод прямого потребительского процесса вызывается вызывающим потоком прямого производителя.

Ответ 4

 from(A).to(B).to(OUT) 

связывает

A --- B --- OUT

Но

from(A ).to( X)
from(B ).to( X)
       from( X).to( OUT )

где X является прямым:?

в основном похож на объединение

A
  \____ OUT
  /
B

очевидно, что это разные типы поведения, а во втором вы можете реализовать любой логический код, который вы хотели, а не только последовательную цепочку

Ответ 5

В основном он используется для разбивки сложной конфигурации маршрута, как в java, мы использовали метод для повторного использования. А также путем настройки потоков по прямому маршруту мы можем уменьшить работу для вызова потока.