“A MBean es un objeto Java que sigue la especificación JMX. Un MBean puede representar un dispositivo, una aplicación o cualquier recurso que deba administrarse. El Interfaz gráfica de usuario de JConsole es una herramienta de monitoreo que cumple con la especificación JMX”.. En este post voy a mostrar cómo he modificado las fuentes de la biblioteca htsjdk para monitorear el programa java leyendo un archivo VCF del servidor Exac. Ver mi compromiso en https://github.com/lindenb/htsjdk/commit/3c1ac1a18917aaa69f8dc49c70fd893a6a0542c3.
Primero, definimos una clase Java ProgresoLoggerMBean para decirle a Java sobre la información que se enviará a jconsole: la cantidad de registros procesados, el tiempo transcurrido, etc.
package htsjdk.samtools.util; public interface ProgressLoggerMBean
La clase htsjdk ya existente htsjdk.samtools.util.ProgressLogger se modifica: ahora implementa ProgressLoggerMBean:
public class ProgressLogger implements ProgressLoggerInterface, Closeable, ProgressLoggerMBean
Los métodos se implementan:
(...) @Override public String getElapsedTime() @Override public String getLastRecord()
En el constructor intentamos conectarnos al servidor MBean que ha sido creado e inicializado por la plataforma. El ProgressLogger se envuelve en un ObjectName y se inserta en el servidor MBean:
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); /* defines an object name for the MBean instance that it will create */ this.objectMBean = new ObjectName("htsjdk.samtools.util:type="+noun); mbs.registerMBean(this, this.objectMBean);
Se utiliza un método de ‘cerrar’ para anular el registro del objeto del servidor MBean:
@Override public void close() { if(this.objectMBean!=null)
Aquí hay un ejemplo. Este programa utiliza la biblioteca htsjdk para analizar un archivo VCF:
import htsjdk.variant.vcf.*; import htsjdk.variant.variantcontext.*; import htsjdk.tribble.readers.*; import htsjdk.samtools.util.*; public class TestProgress
Compilar y ejecutar para descargar exacto:
javac -cp dist/htsjdk-1.130.jar:dist/snappy-java-1.0.3-rc3.jar:dist/commons-jexl-2.1.1.jar:dist/commons-logging-1.1.1.jar TestProgress.java && curl -s "ftp://ftp.broadinstitute.org/pub/ExAC_release/release0.3/ExAC.r0.3.sites.vep.vcf.gz" | gunzip -c | java -cp dist/htsjdk-1.130.jar:dist/snappy-java-1.0.3-rc3.jar:dist/commons-jexl-2.1.1.jar:dist/commons-logging-1.1.1.jar:. TestProgress (...) INFO 2015-05-07 21:07:02 TestProgress Read VCF 675,000 records. Elapsed time: 00:03:33s. Time for last 1,000: 0s. Last read position: 1:168,035,033 INFO 2015-05-07 21:07:03 TestProgress Read VCF 676,000 records. Elapsed time: 00:03:33s. Time for last 1,000: 0s. Last read position: 1:168,216,140 INFO 2015-05-07 21:07:03 TestProgress Read VCF 677,000 records. Elapsed time: 00:03:34s. Time for last 1,000: 0s. Last read position: 1:169,076,058 INFO 2015-05-07 21:07:03 TestProgress Read VCF 678,000 records. Elapsed time: 00:03:34s. Time for last 1,000: 0s. Last read position: 1:169,366,434 INFO 2015-05-07 21:07:03 TestProgress Read VCF 679,000 records. Elapsed time: 00:03:34s. Time for last 1,000: 0s. Last read position: 1:169,500,081 (...)
La progresión ahora puede ser monitoreada en el jconsole:
Eso es todo.
Pedro