Mi primera cola de mensajes (uuuh!)

Entonces, primero que nada leyendo la especificación de JMS, lo que necesito es un mensajero Point-to-point.

Lo primero que necesitaría sería una ConnectionFactory de este tipo, i.e. una QueueConnectionFactory. Éste es el objeto por el que los clientes se conectarán al proveedor de JMS. Ahora, este es un recurso administrado, es decir que se considera que no debiera ser manejado programáticamente. Si yo estoy deployando ActiveMQ como embedded en JBoss >>, ¿dónde hacer este tipo de configuraciones?

No está disponible localhost:8161/admin, veamos dentro de JBoss localhost:8080/admin-console. Tampoco está en la sección JMS Manager, en donde encontramos sólo lo referente a HornetQ Sí está abajo en la parte Applications > Resource Adapter Archives (RARs) donde aparece como activemq-rar-5.5.1.rar, pero no se puede configurar mucho desde ahí…

Ups… ésto es porque no he terminado la configuración de JBoss para que inicie ActiveMQ, lo cual voy a actualizar en el otro artículo mejor >>.

Ok, entonces ya tendríamos el ConnectionFactory de ActiveMQ funcional. Ahora, cómo lo usamos.

En JEE6 puro puedo inyectar directamente la ConnectionFactory y una cola en mis beans

@Stateful
@Model
public class MiBean {

@Resource(mappedName="ConnectionFactory")
private static QueueConnectionFactory connectionFactory;

@Resource(mappedName="/queue/ExpiryQueue")//default de HornetQ
private static Queue queue;

public void enviar() {
QueueConnection conection = (QueueConnection) connectionFactory.createConnection();
QueueSession session = conection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
QueueSender enviador = session.createSender(queue);
TextMessage mensaje = session.createTextMessage("Wena choro");
enviador.send(mensaje);
//...
}

}

que después podemos recibir en un Message Driven Bean así

@MessageDriven(activationConfig = {//las configuraciones son requeridas por JBoss
@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination", propertyValue="queue/ExpiryQueue"),
@ActivationConfigProperty(propertyName="acknowledgeMode", propertyValue="Auto-acknowledge")
})
public class EjemploMDB implements MessageListener {

public EjemploMDB() {}//requiere constructor vacío

public void onMessage(Message message) {
System.out.println("OK:  " + message);
}
}

INFO [STDOUT] OK: HornetQMessage[ID:173223fc-e1a9-11e1-a86e-742f6842e6da]:PERSISTENT

Ahora la cuestión es cómo hacerlo pasar por ActiveMQ

Si en vez de Connection Factory en mappedName pongo

@Resource(mappedName="java:activemq/QueueConnectionFactory")
private static QueueConnectionFactory connectionFactory;

se crea la ConnectionFactory de ActiveMQ

WARN  [org.apache.activemq.broker.jmx.ManagementContext] Failed to start jmx connector: Cannot bind to URL [rmi://localhost:1099/jmxrmi]: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: non-JRMP server at remote endpoint]
INFO  [org.apache.activemq.store.kahadb.plist.PListStore] PListStore:activemq-data/localhost/tmp_storage started
INFO  [org.apache.activemq.broker.BrokerService] Using Persistence Adapter: KahaDBPersistenceAdapter[/home/roberto/JAVA/jboss-6.1.0.Final/bin/activemq-data/localhost/KahaDB]
INFO  [org.apache.activemq.store.kahadb.MessageDatabase] KahaDB is version 3
INFO  [org.apache.activemq.store.kahadb.MessageDatabase] Recovering from the journal ...
INFO  [org.apache.activemq.store.kahadb.MessageDatabase] Recovery replayed 1 operations from the journal in 0.02 seconds.
INFO  [org.apache.activemq.broker.BrokerService] ActiveMQ 5.5.1 JMS Message Broker (localhost) is starting
INFO  [org.apache.activemq.broker.BrokerService] For help or more information please see: http://activemq.apache.org/
WARN  [org.apache.activemq.broker.jmx.ManagementContext] Failed to start jmx connector: Cannot bind to URL [rmi://localhost:1099/jmxrmi]: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: non-JRMP server at remote endpoint]
INFO  [org.apache.activemq.broker.BrokerService] ActiveMQ JMS Message Broker (localhost, ID:aldebaran-44288-1344467448362-0:1) started
INFO  [org.apache.activemq.broker.TransportConnector] Connector vm://localhost Started

lo curioso es que se instancia cuando se solicita su aplicación, y no al iniciar el servidor, que es en todo caso lo que dice acá >>

En todo caso, si cambiamos la inyección del código más arriba por una cola default de ActiveMQ

@Resource(mappedName="activemq/queue/outbound")//ActiveMQ
private static Queue queue;

lo podemos recibir con MDB similar al anterior pero anotado (inspiración >>)

@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination", propertyValue="queue.outbound"),
@ActivationConfigProperty(propertyName="acknowledgeMode", propertyValue="Auto-acknowledge")
})
@ResourceAdapter("activemq-rar-5.5.1.rar")
Este sitio utiliza cookies.    Leer más
Privacidad