¿Cómo se debe empaquetar / implementar un ESB?

Estoy tratando de entender Apache Camel, que parece ser un ESB liviano. Si entiendo Camel / ESB correctamente, entonces puedes pensar en una Ruta Camel como un gráfico de nodos y bordes. Cada nodo es un punto final en la ruta (puede consumir / producir mensajes). Cada borde es una ruta entre dos puntos finales diferentes (1 productor y 1 consumidor).

Suponiendo que sea correcto, tengo una pregunta práctica: ¿qué dictan las mejores prácticas sobre la implementación de la ruta ESB / Camel de su aplicación? ¿Debería empaquetarlo como su propio JAR, o es digno de ser su propio EAR lleno de EJB, servicios web y otros JAR?

Supongo que estoy preguntando cómo se debe implementar / diseñar una Ruta Camel o ESB, como:

my-esb.ear/
    ejb1.jar/
        MyEJB_1.class
    ejb2.jar/
        MyEJB_2.class
    webservice.war/
        MyWebService.class

O...

my-esb.jar/
    MyEJB_1.class
    MyEJB_2.class
    MyWebService.class
Respuesta 1

Según tengo entendido, hay un par de formas en que puede ejecutar Camel.

  1. Incrustado en una aplicación Java : puede incrustar Camel en una aplicación Java independiente. En este escenario, iniciaría un Contexto Camel dentro de su aplicación que iniciará las rutas, etc. Esto es excelente cuando su aplicación necesita comunicarse con servicios, etc. Para que esto funcione, necesitaría desplegar Camel y frascos de terceros para componentes a El classpath.

  2. Incrustado en una aplicación web : como la gente ya ha señalado, esta parece ser una opción popular. Los frascos Camel y los frascos de terceros se envuelven en un archivo WAR y se implementan esencialmente en un contenedor web como Tomcat para alojar los servicios Camel.

  3. Incrustado en un servidor de aplicaciones : he leído algún artículo sobre cómo implementar Camel en un servidor de aplicaciones como JBoss e incluso he leído sobre personas que se están implementando en Glassfish. Esto parece muy similar en cómo se implementa en Tomcat. JBoss tiene algunos problemas de carga de clases que deberías abordar, lo que lo hace complicado. Entonces sí, puede implementar en un servidor de aplicaciones siguiendo la ruta WAR.

  4. Implemente en OSGi : puede hacer que su Camel jar sea un paquete OSGi relativamente rápido e implementarlo en un marco OSGi como Apache Felix. Es relativamente sencillo convertir el jar en un paquete OSGi adecuado y luego implementarlo. El gran problema aquí es que algunos terceros podrían no tener paquetes compatibles con OSGi para que usted los implemente.

Mi preferencia personal es la ruta OSGi. Es fácil y liviano y me permite alojar mis rutas de camellos como servicios persistentes (es decir, servicio de Windows, Unix Deamon) con una huella muy pequeña.

Lo que debe tener en cuenta ahora es que Apache Camel se puede implementar de varias maneras y realmente depende de usted decidir cómo desea hacerlo. Me tomó un tiempo entender cómo implementar Camel, ya que tuve que jugar con los diferentes modelos de implementación para tener una buena idea. El único que no he tocado fue la implementación en un servidor de aplicaciones, ya que sentí que la mayoría de estos servidores son lo suficientemente pesados.

En cuanto a la arquitectura, me gusta mantener mis diferentes rutas / aplicaciones en diferentes frascos. Como estoy usando OSGi, me gusta poder actualizar una ruta específica e implementarla sin tener que volver a implementar todo. Si desplegó todo en un jar, necesitaría derribar el mundo, reconstruir y volver a implementar el jar. Sin embargo, esta es una preferencia personal y su kilometraje puede variar.

Espero que esto ayude un poco.

Respuesta: 2

Déjame responder a tus preguntas una por una:

Proporciona una lista descriptiva, no vaga, de factores generales que deberían usarse para determinar la mejor manera de implementar un ESB (ya sea como un EAR único con cada punto final como un JAR incorporado o como un JAR "monolítico" único);

El frasco empotrado o monolítico no importa. Lo que importa es el paquete o el despliegue de guerra. En el caso de un paquete independiente , puede terminar con un archivo de implementación muy pesado que tiene muchos frascos para la resolución de la dependencia.

Explica completamente por qué Camel podría no funcionar bien con servidores de aplicaciones Java EE como JBoss o GlassFish

  1. La gestión de subprocesos / recursos / puertos de App-Server / Container puede imponer restricciones.

  2. Conflicto de la versión de biblioteca comúnmente utilizada

  3. Conflicto en el mecanismo de carga de clase

Lógicamente, si su contenedor es compatible con OSGi, Camel no debería enfrentar ningún problema.

  1. Como Apache Camel es un enrutador de mensajes muy liviano, definitivamente puede empaquetarlo en su oído junto con su aplicación web como un archivo de guerra . Si está utilizando maven / Ivy y su contenedor web es compatible con osgi, ¡entonces Bingo! La vida será mucho más fácil.
  2. La segunda opción es implementar su aplicación como un paquete
  3. y otro es Java SE jar independiente.

Siga los enlaces a continuación [Sin embargo, bastante desactualizado], estos le darán instrucciones paso a paso sobre el empaque, al menos claridad sobre el mecanismo del empaque:

Camello paso a paso

Camello en una aplicación web

Camel Real Life Packaging & Deployment en entorno OSGi

Respuesta: 3

Al igual que en las otras respuestas, depende de sus necesidades, pero un ESB suele ser una combinación de diferentes procesos de integración que no necesariamente comparten el mismo ciclo de vida.

Si este es el caso, sugiero utilizar un jarenfoque por proceso de integración. De esa manera, puede tener diferentes ciclos de vida de desarrollo para cada uno de los diferentes jary puede asegurar a su cliente que no ha tocado ninguno de los códigos, excepto el que está en él jar.

Esto no significa que tenga que ir con la earsolución. Puede empaquetar perfectamente el código para sus diferentes procesos en un wararchivo sin la earsobrecarga.

Respuesta: 4

Estoy empezando a aprender algo de Java y he estado leyendo mucho sobre cómo la memoria es asignada por la JVM y, en consecuencia, cómo se libera esta memoria utilizando el recolector de basura. Una cosa que tengo ...

Me preguntaba si hay una manera sencilla de mostrar números de línea con el campo de texto StyledText, incluso si las líneas están ajustadas. Lo estoy usando en mi aplicación y si el contenido se vuelve grande, alguna línea ...

Actualmente estoy escribiendo un código para hacer un Knight's Tour. Estoy tratando de pasar una matriz doble (la placa) a un método y recibo un error que se espera. No sé cómo se supone que debo declarar ...

Estoy tratando de usar Java 8 para devolverme una lista de valores clave (enteros) en la que se marca el valor (casilla de verificación). El mapa que estoy tratando de procesar es de la siguiente forma. Mapa <Integer, CheckBox> ...