Los portlets podrán publicar eventos durante las fases de "Process Action" y "Process Events" y el portal será el encargado de recibir los eventos publicados y redistribuirlos a los portles suscriptos.
Los portles recibirán los eventos durante la fase de "Process Events" pudiendo publicar nuevos eventos. Terminada la fase de "Process Events" no se permite publicar nuevos eventos y comienza la fase de "Render".
Este post esta orientado para el manejo de eventos con WebSphere Portal 6.1
Primero que todo debemos declarar el portlet que publicara el evento y el portlet que lo procesara.
Al portlet que publicara el evento se le debe adicionar las siguientes declaraciones en el archivo portlet.xml
<portlet> . .. ... <supported-publishing-event> <name>event</name> </supported-publishing-event> </portlet>Donde "event" es el nombre del evento que se publicara
Al portlet que procesara el evento se le debe adicionar las siguientes declaraciones en el archivo portlet.xml
<portlet> <portlet-class>co.com.colombia.BeanProcessEvent</portlet-class> . .. ... <supported-processing-event> <name>event</name> </supported-processing-event> </portlet>
Donde "event" es el nombre del evento que se procesara y
"co.com.colombia.BeanProcessEvent" es el Bean donde se encuentra nuestro metodo que procesara el evento, mas adelante veremos porque colocamos el nuestro y no el que nos provee el portletbridge
Luego agregamos el tipo de dato que sera enviado al publicar el evento y posteriormente sera procesado.
<portlet-app>
<portlet>
.
..publish
...
</portlet>
<portlet>
.
..process
...
</portlet>
<default-namespace>http://mi_namespace/</default-namespace>
<event-definition>
<name>event</name>
<value-type>java.lang.String</value-type>
</event-definition>
</portlet-app>
Ahora vamos con nuestros backing beans
public class BeanPublishEvent{
public void doButton1Action(ActionEvent e) {
// Type Java code that runs when the component is clicked
// TODO: Return outcome that corresponds to a navigation rule
PortletResponseWrapper responseWrapper = (PortletResponseWrapper)getFacesContext().getExternalContext().getResponse();
ActionResponse response = (ActionResponse)responseWrapper.getPortletResponse();
String text = "Hola";
//Disparar Evento
System.out.println("Send Message for doButton1Action");
//Nombre evento, y dato que se envia
response.setEvent("event", text);
}
} public class BeanProcessEvent extends FacesPortlet{
@ProcessEvent(name="event")
public void processConfirmation(EventRequest request, EventResponse response)
throws PortletException, java.io.IOException {
System.out.println("Event Received in");
Event myEvent = request.getEvent();
String text = (String) myEvent.getValue();
System.out.println("Se recibio" + text);
}
}
Si se dan cuenta la clase que procesa el evento extiende de FacesPortlet que es la clase que nos suministra el portletbridge, por eso hay que colocarla en el portlet.xml para que el contenedor sepa cual es el metodo que procesara el evento.
Y por ultimo configuramos la conexiones o el wired de la pagina que contendra los portlets.
Para otros portales este página les puede ser útil http://www.dosideas.com/wiki/Eventos_De_JSR_286