Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

...

En el caso que la aplicación este desplegada en un cluster con varios nodos, y el evento push se lanza desde un nodo diferente al que esta conectado el cliente (Navegador Web), entonces este no será notificado. Una solución es usar temas (topic) JMS, lanzar el evento push a través de JMS, y usar MDB (message driven bean) para reenviar el evento push a JBoss Seam en cada nodo.


Con JBoss Seam tenemos varios componentes para ayudar a trabajar con JMS. Ejemplo para la configuración de JMS con JBoss Seam, en el fichero components.xml registramos el manager del tema (topic) JMS, como norma general, el nombre del tema  comenzara con el nombre de la aplicación en minúsculas seguido de PushTopic, en el ejemplo usaremos pruebaPushTopic. Para el nombre del publisher, podemos usar el nombre que queramos. Veamos un ejemplo de configuración:

Bloque de código
languagexml
<jms:managed-topic-publisher name="pruebaPushPublisher" 
                             auto-create="true" 
                             topic-jndi-name="topic/pruebaPushTopic"/>

Veamos un ejemplo puro con JMSAhora se puede inyectar el componente pruebaPushPublisher en cualquier componente:

Bloque de código
languagejava
@Singleton
@TransactionAttribute(NOT_SUPPORTED@Name("pushChangeNotifier")
public class PushManagerPushChangeNotifier {

   @In
 @Resource(lookup = "java:/jms/topic/push")
    private Topic jmsTopic; private TopicPublisher pruebaPushPublisher;   

    @In
    private JMSContextTopicSession jmsContexttopicSession;

    public void fireEventpublish(PushEvent pushEventevent) {
        try {
           pruebaPushPublisher.publish(topicSession.createObjectMessage(event.getMessage()));
       Message jmsMessage} =catch jmsContext.createMessage(Exception ex); {
            jmsMessage.setStringProperty("message", pushEvent.getMessage());throw new RuntimeException(ex);
        } 
   }

}


Para recibir los mensajes JMS tenemos que configurar un MDB:

Bloque de código
languagejava
@MessageDriven(activationConfig = {
    @ActivationConfigProperty(
        propertyName = "destinationType",
        propertyValue = "javax.jms.Queue"
    ),
    @ActivationConfigProperty(
        propertyName = "destination",
        propertyValue = "topic/pruebaPushTopic"
    )
})
@Name("pushReceiver")
public class pushReceiver implements MessageListener {

   @Logger
   private Log log;

   @Push
   private PushContext someChannel;
  
   @Override
   public void onMessage(Message message) {
      try {
         jmsContextsomeChannel.createProducersend((ObjectMessage) message).send(jmsTopic, jmsMessagegetObject());
        }
        catch (ExceptionJMSException eex) {
         log.error("Problem sending push //event Handle.message.", ex);
       } }
    }

}


sssss