Communication basée sur des événements d'un portlet JSR 286

Les événements d'un portlet fournissent un mécanisme de publication/abonnement puissant et flexible pour la communication entre des portlets JSR 286. Ils peuvent être utilisés pour échanger des données complexes entre des portlets et pour déclencher l'activité de portlets, comme des mises à jour sur des systèmes dorsaux. Dans le portail, ils peuvent aussi interopérer avec d'autres mécanismes de communication, comme des portlets coopératifs et click-to-action.

Pour plus d'informations sur le mécanisme de distribution d'événements du portail, voir la section sur le portail Courtier d'événements.

Concepts de Java Portlet Specification 2.0

Les détails de programmation pour des événements de portlets sont définis dans Java Portlet Specification 2.0. Les portlets peuvent publier des événements à l'aide de l'appel response.setEvent() et recevoir des événements dans la méthode processEvent. La classe GenericPortlet fournit un mécanisme de gestion d'événements par défaut qui répartit les événements en fonction de l'annotation @ProcessEvent .

En tant que programmeur de portlets, déclarez tous les événements qu'un portlet peut publier ou recevoir dans le descripteur de déploiement portlet.xml.

Exemple de déclaration dans le descripteur de déploiement :
<portlet-app xmlns:x="http://www.cntserv_exmp.com/portlet" 
             xmlns:std="http://somestandardsbody.org/interop-events">
    <portlet>
        ...
        <supported-processing-event>
            <qname>x:address.showForUpdate</qname>
        </supported-processing-event>
        <supported-publishing-event>
            <qname>x:address.updated</qname>
        </supported-publishing-event>
    </portlet>
    <event-definition>
        <qname>x:address.showForUpdate</qname>
        <alias>std:address</alias>
        <value-type>com.acme.portlets.common.Address</value-type>
    </event-definition>  
    <event-definition>
        <qname>x:address.updated</qname>
        <alias>std:address</alias>
        <value-type>com.cntserv_exmp.portlets.common.Address</value-type>
    </event-definition>  
</portlet-app>
Ceci déclare un événement de publication et de traitement avec une charge Java de la classe com.acme.portlets.common.Address et des noms complets address.showForUpdate et address.updated dans l'espace de nom http://cntserv_exmp.com/portlet. Par ailleurs, l'alias address dans l'espace de nom http://somestandardsbody.org/interop-events de certaines organisations de standardisation indique que ces événements sont compatibles avec ceux d'un autre portlet portant le même alias ; ils peuvent donc fonctionner avec les valeurs d'entrée et de sortie du type d'adresse fourni. Voici un exemple de codage :
public class MyPortlet extends GenericPortlet {
    public static String NAMESPACE = "http://cntserv_exmp.com/portlet";
    
    @ProcessAction(name="address.updated")
    public void addressUpdated(ActionRequest request, ActionResponse response) {
      ...
      Address myAddress = ...;
      response.setEvent(new QName(NAMESPACE, "address.updated"), myAddress);
    } 
    @ProcessEvent(name="address.showForUpdate")
    public void addressUpdated(EventRequest request, EventResponse response) {
      Address myAddress = (Address) request.getEvent();
      ...
    }

Contrôle de la distribution d'événements dans le portail

Java Portlet Specification ignore volontairement comment les événements sont envoyés entre des portlets et indique seulement comment ils sont publiés et reçus. Dans HCL Digital Experience version 8.5, la distribution d'événements dépend du courtier d'événements et des techniques de connexion employées pour connecter des portlets coopératifs. Ainsi, lorsque vous placez un portlet dans une page, il ne peut au départ pas publier ou recevoir des événements. Vous devez utiliser l'utilitaire de connexion de portlets pour connecter les événements déclarés par portlet à des sorties ou des entrées d'autres portlets.

Les portlets peuvent déclarer des noms affichés localisés et des descriptions pour les événements dans le regroupement de ressources de l'application. Entrez au moins un nom affiché, sachant que l'utilitaire de connexion de portlets a besoin de ces informations pour afficher correctement des sources et des cibles d'événements.

Le portlet EventDistributionService permet d'afficher des éléments de l'interface utilisateur selon si un événement donné est connecté aux cibles. Les informations de connexion fournies par ce service de portlet sont disponibles pour toutes les demandes dans lesquelles la propriété com.ibm.portal.portlet.Constants.FEATURE_EVENT_DISTRIBUTION_SERVICE est définie et disponible. Pour les demandes WSRP entrantes, cette propriété n'est pas disponible.

Support pour des types d'événements complexes

Comme expliqué précédemment, les événements de portlets supportent des types Java complexes (comme charges). Java Portlet Specification requiert que les classes de charge supportent la sérialisation Java, ainsi que celle XML, à l'aide d'annotations JAXB (Java XML Binding). Le portail supporte le transfert de ces charges entre portlets, même si elles sont déployées dans différents fichiers WAR. Toutefois, si la classe de charge est intégrée au fichier WAR du portlet, il est nécessaire de sérialiser et de désérialiser des valeurs lors du transport, car les portlets utilisent des chargeurs de classe distincts, ce qui entraîne des performances d'exécution peu optimales.

Pour obtenir des performances optimales de transfert de charges Java complexes, et ce en acceptant un processus de déploiement plus compliqué, supprimez les classes de charge du fichier WAR et déployez-les dans un chargeur de classe partagé par les portlets. Pour ce faire, utilisez les bibliothèques partagées IBM® WebSphere® Application Server ou placez les classes partagées dans le répertoire wp_profile_root/PortalServer/config.