Interoperabilidad de los servicios telemáticos de la Administración Pública de la CAC Página 1 de 10 Consumo de ActiveMQ en Pre Documento de consumo Rev. Fecha Descripción 1 21/03/13 Primera versión de la documentación de las colas en Pre-Explotación. Documento PLA-DOC-FIN-13-03-21-Consumo de ActiveMQ en Ubicación en ecarpeta Oficina Técnica Platino > Seguimiento del proyecto > Actas e informes Preparado por Revisado por Aprobado por Alejandro Romero Carlos López Oficina Técnica de Platino Oficina Técnica de Platino DGTNT Fecha: 21/03/13 Fecha: 21/03/13 Fecha: 21/03/13
Página 2 de 10 ÍNDICE 1 INTRODUCCIÓN...3 2 MECANISMOS DE CONEXIÓN...4 2.1 Documentación...4 2.2 Ejemplo...4 2.2.1 Envío para queue...4 2.2.2 Recepción para queue...5 2.2.3 Utilidades...5 3 TOPICS HABILITADOS...9 4 QUEUES HABILITADAS EN PLATINO...10
Página 3 de 10 1 INTRODUCCIÓN El presente documento pretende mostrar los Topics y las Queues en ActiveMQ disponibles en Platino en el entorno de PRE-Explotación y la correcta conexión. El documento se estructura de la siguiente forma: Mecanismos de conexión. Topics habilitados. Queues habilitadas. En la nueva plataforma se encuentra instalado ActiveMQ 5.5.1-Fuse-10 en standalone, para la mensajeria JMS. Esta instalación se ha realizado en 2 nodos (quiquere1 y quiquere2), configurándolo en activo-pasivo.
Página 4 de 10 2 MECANISMOS DE CONEXIÓN 2.1 Documentación Actualmente existen muchos mecanismos de conexión estables con ActiveMQ. En este documento se presentará una opción de conexión en código Java como apoyo. A continuación se presentan la información que más se debe de tener en cuenta a la hora de realizar la conexión: La url de conexión se debe de indicar en modo failover. La conexión que se deberá utilizar es: failover: (ssl://quiquere1.gobiernodecanarias.net:61617,ssl://quiquere2.gobiernodeca narias.net:61617) ActiveMQ permite diferentes maneras de conexión a los topics y a las queues. En el caso que se nos presenta siempre se deberá de realizar la conexión en modo seguro SSL, por lo que tendremos que utilizar el certificado del aplicativo y el truststore, proporcionados por Platino en el procedimiento de obtención del certificado de consumo, para poder realizar la conexión. El cliente utilizado debe ser único por aplicativo, de manera que no se genere un nuevo suscriptor en cada nueva conexión. A continuación indicamos un ejemplo de envío y recepción de mensajes en una queue. 2.2 Ejemplo 2.2.1 Envío para queue try { jmsconnection = new JmsConnection("MiCliente", JmsConnection.SSL_CONNECTION, true); session = jmsconnection.createqueuesession(); destination = session.createqueue("queue/nombredelacola"); MessageProducer producer = session.createproducer(destination); TextMessage message = null; message = session.createtextmessage(); message.settext("prueba de mensaje"); message.setstringproperty(destinatario,destinatario); for (int i = 0; i < numeromensajes; i++) { producer.send(message); producer.close();
Página 5 de 10 catch (Exception e) { System.out.println(e.getMessage()); 2.2.2 Recepción para queue TextMessageHandler textmessagehandler = null; try { textmessagehandler = new TextMessageHandler(numeroMensajes); jmsconnection = new JmsConnection("MiCliente", JmsConnection.SSL_CONNECTION, true); jmssuscriber = new JmsSuscriber(jmsConnection, "queue/nombredelacola", true); jmssuscriber.receive(textmessagehandler, true); Assert.assertEquals("El numero mensajes leidos no es el esperado", numeromensajes, textmessagehandler.getmensajesrecibidos().size()); catch (Exception e) { System.out.println(e.getMessage()); 2.2.3 Utilidades JmsConnection public class JmsConnection { private static final String LOCALHOST = "localhost"; static Logger log = Logger.getLogger(JmsConnection.class.toString()); public static final int SSL_CONNECTION = 0; public static final int TCP_CONNECTION = 1; private ActiveMQConnectionFactory connectionfactory = null; private TopicConnection topicconnection; private QueueConnection queueconnection; /** * Constructor de una conexión JMS. * * @param clientid * clientid el clientid de la conexión * @param connectiontype * Tipo de conexión (SSL TCP) para establecer la cola a la que * se conecta * @param queue * Indica si es queue o no. * @throws Exception */ public JmsConnection(String clientid, int connectiontype, Boolean queue) throws Exception { connectionfactory = new ActiveMQConnectionFactory( geturlcolajms(connectiontype)); connectionfactory.setclientid(clientid); log.info("creando Conexión JMS. Autenticación mediante certificado"); queueconnection = connectionfactory.createqueueconnection(); log.info("clientid de la conexión: " + queueconnection.getclientid()); private String geturlcolajms(int connectiontype)
Página 6 de 10 throws FileNotFoundException, IOException { if (connectiontype == TCP_CONNECTION) { return geturlcolatcp(); return geturlcolassl(); private String geturlcolatcp() throws FileNotFoundException, IOException { String urlcolajms = null; urlcolajms = "failover: (tcp://quiquere1.gobiernodecanarias.net:61616,tcp://quiquere2.gobiernodecanarias.net:61616)"; log.info("cola TCP : '" + urlcolajms + "'"); return urlcolajms; private Properties getproperties(string file) throws FileNotFoundException, IOException { Properties properties = new Properties(); properties.load(new FileInputStream(file)); return properties; private String geturlcolassl() throws FileNotFoundException, IOException { String urlcolajms = null; Properties properties = getproperties("etc/jms/credenciales-ssl.properties"); System.setProperty("javax.net.ssl.keyStore", properties.getproperty("keystore")); System.setProperty("javax.net.ssl.keyStorePassword", properties.getproperty("keystorepassword")); System.setProperty("javax.net.ssl.keyStoreType", properties.getproperty("keystoretype")); System.setProperty("javax.net.ssl.keyStoreAlias", properties.getproperty("keystorealias")); System.setProperty("javax.net.ssl.trustStore", properties.getproperty("truststore")); System.setProperty("javax.net.ssl.trustStorePassword", properties.getproperty("truststorepassword")); urlcolajms = "failover: (ssl://quiquere1.gobiernodecanarias.net:61617,ssl://quiquere2.gobiernodecanarias.net:61617)"; log.info("cola SSL : '" + urlcolajms + "'"); return urlcolajms; public TopicSession createsession() throws JMSException { log.info("creando Session JMS"); return topicconnection.createtopicsession(false, Session.AUTO_ACKNOWLEDGE); public QueueSession createqueuesession() throws JMSException { log.info("creando Session JMS"); return queueconnection.createqueuesession(false, Session.AUTO_ACKNOWLEDGE); public void start() throws JMSException { topicconnection.start(); public void stop() throws JMSException { topicconnection.stop(); public void close() throws JMSException { log.info("cerrando conexiones"); if (topicconnection!= null) { topicconnection.close();
Página 7 de 10 public ActiveMQConnectionFactory getconnectionfactory() { return connectionfactory; public void setconnectionfactory(activemqconnectionfactory connectionfactory) { this.connectionfactory = connectionfactory; public TopicConnection gettopicconnection() { return topicconnection; public void settopicconnection(topicconnection topicconnection) { this.topicconnection = topicconnection; JmsSuscriber public class JmsSuscriber { static Logger log = Logger.getLogger(JmsSuscriber.class.toString()); private TopicSubscriber subscriber; private QueueReceiver queuereceiver; private JmsConnection jmsconnection; private int maxsegundosespera = 30; public JmsSuscriber(JmsConnection jmsconnection, String queuename, Boolean isqueue) throws JMSException { this.jmsconnection = jmsconnection; QueueSession queuesession = jmsconnection.createqueuesession(); Queue queue = queuesession.createqueue(queuename); queuereceiver = queuesession.createreceiver(queue); setmaxsegundosespera(maxsegundosespera); public void receive(jmsmessagehandler messagehandler, Boolean queue) throws JMSException { queuereceiver.setmessagelistener(messagehandler); try { jmsconnection.start(); log.info("esperando (max " + getmaxsegundosespera() + " segundos)"); for (int i = 0; i < getmaxsegundosespera(); i++) { Thread.sleep(1000L); if (messagehandler.detener()) { log.info("parando espera activa"); break; log.info("fin de Espera"); catch (InterruptedException e) { e.printstacktrace(); finally { jmsconnection.stop(); public void setmaxsegundosespera(int maxsegundosespera) { this.maxsegundosespera = maxsegundosespera;
Página 8 de 10 public int getmaxsegundosespera() { return maxsegundosespera; public TopicSubscriber getsubscriber() { return subscriber; public void setsubscriber(topicsubscriber subscriber) { this.subscriber = subscriber; TextMessageHandler public class TextMessageHandler extends JmsMessageHandler { static Logger log = Logger.getLogger(TextMessageHandler.class.toString()); private int expectedmessages = 0; private List<TextMessage> mensajesrecibidos; @Override public void onmessage(message message) { log.info(message.tostring()); if (message instanceof TextMessage) { try { TextMessage textmessage = (TextMessage) message; log.info("---> mensaje para: " + textmessage.getstringproperty("destinatario")); log.info("---> mensaje recibido: " + textmessage.gettext()); mensajesrecibidos.add(textmessage); catch (Exception e) { log.log(level.severe, "Error procesando mensaje JMS", e); public TextMessageHandler(int expectedmessages) { super(); this.expectedmessages = expectedmessages; mensajesrecibidos = new ArrayList<TextMessage>(); @Override public boolean detener() { log.log(level.fine, "Recibidos " + mensajesrecibidos.size() + " mensajes, esperados " + expectedmessages); return (mensajesrecibidos.size() == expectedmessages); public List<TextMessage> getmensajesrecibidos() { return mensajesrecibidos; public void setmensajesrecibidos(list<textmessage> mensajesrecibidos) { this.mensajesrecibidos = mensajesrecibidos;
Página 9 de 10 3 TOPICS HABILITADOS Actualmente Platino utiliza 4 topics para la comunicación entre los servicios y los backoffices, son los siguientes: Servicio Nombre del topic Documentación del servicio SST topic/tramitacion/backoffice http://www.gobiernodecanarias.org/platino/docs/soporte_tramitacion_telematic a.pdf 1 TERC topic/terceros/backoffice http://www.gobiernodecanarias.org/platino/docs/base_datos_terceros.pdf 2 SPF topic/portafirmas/backoffice http://www.gobiernodecanarias.org/platino/docs/portafirmas.pdf 3 NOTIF topic/enotificacion/backoffice http://www.gobiernodecanarias.org/platino/docs/notificaciones_electronicas.pd f 4 1 http://www.gobiernodecanarias.org/platino/docs/soporte_tramitacion_telematica.pdf 2 http://www.gobiernodecanarias.org/platino/docs/base_datos_terceros.pdf 3 http://www.gobiernodecanarias.org/platino/docs/portafirmas.pdf 4 http://www.gobiernodecanarias.org/platino/docs/notificaciones_electronicas.pdf
Página 10 de 10 4 QUEUES HABILITADAS EN PLATINO Actualmente Platino utiliza 1 queue para la comunicación entre los backoffices y los servicios, son los siguientes: Servicio Nombre del topic Documentación del servicio SST queue/backoffice/tramitacion http://www.gobiernodecanarias.org/platino/docs/soporte_tramitacion_telematic a.pdf 5 5 http://www.gobiernodecanarias.org/platino/docs/soporte_tramitacion_telematica.pdf