2012-06-08 3 views
10

El DirectComponent documentation da el siguiente ejemplo:¿Cuál es la diferencia entre "direct:" y to() en Apache Camel?

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"); 

¿Hay alguna diferencia entre eso y el siguiente?

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

He tratado de encontrar documentación sobre lo que el comportamiento del método() está en el Java DSL, pero más allá del RouteDefinition javadoc (que da la muy brusco "Envía el cambio en el punto final dado") he venido arriba en blanco :(

Respuesta

13

En el caso anterior, no se notará mucha diferencia. el componente "directa" es muy similar a una llamada al método.

vez que empiece a construir rutas un poco más complejas , querrá segmentarlos en varias partes diferentes por varias razones.

Puede, por ejemplo, crear "rutas secundarias" que podrían reutilizarse entre múltiples rutas en su contexto de Camel. Al igual que segmenta los métodos en la programación regular para permitir la reutilización y hacer que el código sea más claro. Lo mismo aplica para las rutas secundarias que usan, por ejemplo, el componente directo.

El mismo enfoque se puede ampliar. Digamos que quiere que se utilicen varios protocolos como puntos finales en su ruta. Usted puede utilizar el criterio de valoración directa para crear la ruta principal, algo como esto:

// 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"); 

Otra cosa es que se crea una ruta para cada uno "de()" cláusula de DSL. Una ruta es un artefacto en Camel, y podría realizar ciertas tareas administrativas con la API de Camel, como iniciar, detener, agregar, eliminar rutas dinámicamente. La cláusula "para" es solo una llamada de punto final.

Una vez que empiezas a hacer algunos casos reales con cierta complejidad en Camel, notarás que no puedes obtener demasiadas rutas "directas".

+0

OK. Entiendo que es un punto de reutilización/identidad; ¿Es el caso que no hay diferencia de comportamiento? – bacar

+0

'La cláusula "a" es solo una llamada de punto final'. - qué, _precisamente_, ¿significa esto? Suena un poco vago. – bacar

+0

La cláusula to hará exactamente lo que dijo en su pregunta. Envíe el intercambio a un punto final de un componente, donde el intercambio es el sobre del mensaje, y el punto final es una cierta configuración de un componente. El comportamiento de to() depende mucho del componente (http: // http: //camel.apache.org/components). –

2

Direct Component se utiliza para nombrar el segmento lógico de la ruta. Este es un proceso similar a los procedimientos de denominación en la programación estructural.

En su ejemplo, no hay diferencia en el flujo de mensajes. En términos de programación estructural, podríamos decir que hace una especie de inline expansion en su ruta.

+0

¿Hay ejemplos similares en los que existe una diferencia? – bacar

+0

Básicamente esta es la diferencia :). Directo == Nombre lógico –

+0

Quise decir en el comportamiento observado. Suena como un no. – bacar

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

está encadenando

A --- B --- OUT 

Pero

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

donde X es un :? directa

es básicamente como una unión

A 
    \____ OUT 
/
B 

obviamente estos son diferentes comportamientos, y con la segunda se podrían aplicar AnyLogic que quería, no sólo una cadena en serie

+0

¿Cómo comenzaría una ruta desde (directo) ... y luego leería un archivo? – MRK187

+0

de (archivo) .to (directo) sus preguntas son un poco ambiguas, por lo que me estoy aproximando a lo que supongo que quiere decir. Si repite más explícitamente, puedo decirlo con mayor precisión Si quiere decir un disparador, intente con "pollenrich()" - No diluyo bien el kit documentado, pero es como un disparador de (directo: A) .pollenrich (B) –

1

Otra diferencia es el componente directo no tiene un grupo de subprocesos, el subproceso de llamada del productor directo invoca el método de proceso de consumidor directo.

0

Se utiliza principalmente para romper la configuración de ruta compleja como en java que solíamos tener el método para la reutilización. Y también configurando los hilos en la ruta directa podemos reducir el trabajo para el hilo de llamada.

Cuestiones relacionadas