¿Cómo hacer JMX sobre JMS?

Necesito mejorar las interfaces JMX de una aplicación Java distribuida. La razón para elegir JMX es la simplicidad de exponer datos. Estas aplicaciones distribuidas existen en varias máquinas diferentes conectadas a un servidor JMS (activemq 5.7) (que a su vez está conectado a otro servidor JMS para conectar 2 redes, también activemq 5.7).

Lo que me gustaría hacer es poder acceder a las interfaces JMX remotas en los servidores individuales desde cualquier lugar de la red JMS. Necesitaría acceso completo a JMX como si acceda a través de la interfaz RMI habitual. Eso significa todo tipo de acción.

Entiendo que podría usar jerga para que las interfaces jmx remotas hablen con el servidor JMS, y desde allí mi puente debería permitirme acceder a ellas (suponiendo que esté configurado correctamente).

¿Es este un buen enfoque? ¿Alguien ha probado la jerga para este propósito? ¿Hay otras opciones que quizás no haya encontrado?

Un plan B podría ser usar el módulo apache camel RMI, pero parece que si la jerga es una opción, será mucho más plug & play que esto.

Respuesta 1

Creo que no es un mal camino a seguir. La única desventaja de usar JMS en la que puedo pensar, fuera de mi cabeza, es la dependencia de un corredor , en el que se basan la mayoría de las implementaciones de JMS.

Por otro lado, presenta algunas capacidades interesantes como descubrimiento, invocación JMX asincrónica y operaciones JMX de estilo pub / sub multidifusión donde puede emitir una solicitud de operación y recibir una respuesta de todos sus MBeanServers.

No conozco ninguna implementación real, pero probablemente no sea demasiado difícil de implementar. Simplemente necesita un cliente configurado en cada JVM de destino que:

  1. Escuche las solicitudes JMX: el oyente desestimará la solicitud (que debe ser una codificación de una invocación del método MBeanServerConnection ). Use un tema común para las invocaciones de estilo pub / sub, devolviendo el resultado ordenado al destino especificado en la propiedad JMSReplyTo en el mensaje de solicitud. De lo contrario, podría asignar una cola por JVM o elegir un identificador único para cada JVM y usar selectores de mensajes.
  2. Si desea implementar notificaciones JMX, deberá implementar un NotificationListener proxy que registre las notificaciones deseadas y las reenvíe al destino JMS designado al recibirlas.

También puede considerar implementar una implementación completa de javax.management.remote que pueda integrarse más fácilmente en su entorno en virtud de la adherencia estándar.

El proyecto OpenDMK me pareció muy útil para extender / implementar servidores y clientes JMX. La biblioteca proporciona los componentes básicos para implementar una solución remota estándar JMX utilizando un protocolo "personalizado". Básicamente, implementa un javax.management.remote.generic.MessageConnection que sirve como mecanismo de transporte e invocación. Todas las invocaciones, respuestas y devoluciones de llamada de JMX se serializan en instancias de javax.management.remote.message.Message, y todas son serializables, por lo que no debería tener problemas para escribirlas y leerlas desde JMS ObjectMessage s.

Un par de beneficios adicionales que obtendrá de este enfoque son:

  1. Siempre que configure la ruta de clase correctamente, debería poder conectarse a sus JVM utilizando cualquier herramienta JMX estándar como JConsole.
  2. OpenDMK también proporciona la capacidad de federar MBeanServers, lo que hace que todas sus instancias de MBeanServer aparezcan y sean accesibles a través de un MBeanServer central. Esta característica requiere una implementación estándar de comunicación remota JMX.
  3. OpenDMK también implementa un interesante protocolo de descubrimiento de servicios, y viene en un par de sabores diferentes que incluyen multidifusión en bruto y un enfoque de "teléfono-hogar" que encajaría perfectamente con su protocolo JMS.

Publiqué un proyecto de OpenDMK aquí si estás interesado.

Estoy implementando un cliente JMX básico para agentes Java utilizando netty, y opcionalmente admite solicitudes JMX asíncronas. Las respuestas se entregan a través de un oyente registrado que es como una MBeanServerConnection "inversa". En caso de que esto sea útil, encuentre la fuente aquí .

Respuesta: 2

Jolokia (http://www.jolokia.org/) también es un gran proyecto para acceder de forma remota a JMX usando REST y JSON. Hace esto automáticamente por ti. Y también admite operaciones por lotes. Sugiero echar un vistazo a eso.

Si usa JMX para obtener estadísticas AMQ, entonces ofrece un complemento, por lo que puede usar la mensajería JMS para obtener las estadísticas en lugar de JMX: http://activemq.apache.org/statisticsplugin.html

Respuesta: 3

Cuando estoy creando una constante en IntelliJ (usando Ctrl + Alt + C), por defecto es public static final. ¿Cómo puedo hacerlo privado estático final en su lugar?

En mi clase de servicio de ámbito único a continuación, todos los métodos de la clase requieren un contexto de usuario que se conoce cuando se llama a Service.doA (). En lugar de pasar información a través de métodos, estaba pensando ...

Me gustaría saber si es posible agregar una línea en un archivo con Java. Por ejemplo, myFile: 1: línea 1 2: línea 2 3: línea 3 4: línea 4 Me gustaría agregar un ejemplo de línea zorro en la tercera línea para que ...

Hoy, cuando estaba leyendo mis notas de clase, no entiendo cuál es el propósito de extender en este contexto. Considere este código: import java.net. *; import java.awt. *; clase pública QueenApl ...