Uso del sistema de subscripciones en Liferay 6.2


Una herramienta muy potente incluida en Liferay es su sistema de subscripciones, que nos permite subscribir a usuarios a los cambios en cualquier elemento del portal.

Para esto, simplemente tenemos que crear un método para subscribir, otro para desubscribir y otro para notificar. Estos tres métodos los crearemos dentro de la clase XXXLocalServiceImpl propia de la entidad objeto de la subscripción.

Como ejemplo, queremos subscribir a los usuarios a lo cambios en los índices bursátiles, así que modificaremos la clase IndiceLocalServiceImpl:

public class IndiceLocalServiceImpl
	extends IndiceLocalServiceBaseImpl {
	...
	public void subscribeIndice(long userId, long resourcePrimKey)
		throws PortalException, SystemException {

		SubscriptionLocalServiceUtil.addSubscription(userId, 0,
			Indice.class.getName(), resourcePrimKey);
		}
	...
}

Con este método, subscribimos al usuario con identificador userId al índice bursátil con identificador resourcePrimKey.

public class IndiceLocalServiceImpl
	extends IndiceLocalServiceBaseImpl {
	...
	public void unsubscribeIndice(long userId, long resourcePrimKey)
		throws PortalException, SystemException {

		subscriptionLocalService.deleteSubscription(
			userId, Indice.class.getName(), resourcePrimKey);
		}
	...
}

Con este otro método, anulamos la subscripción del usuario con identificador userId al índice bursátil con identificador resourcePrimKey.

Ahora solo nos falta crear un método para llamar cuando queramos notificar a los usuarios subscritos (por ejemplo si lo hacemos dentro de la función updateIndice, cada vez que modificáramos un índice, notificaríamos a todos los usuarios que estuviesen subscritos al mismo).

...
    public void sendNotification(
            Indice indice, String body, String subject, long groupId, long userId, ServiceContext serviceContext)
        throws PortalException, SystemException {
 
        Group group = GroupLocalServiceUtil.getGroup(groupId);
        // Cuerpo del mensaje
        SubscriptionSender subscriptionSender = new SubscriptionSender();
        subscriptionSender.setBody(body);
        subscriptionSender.setCompanyId(group.getCompanyId());
        subscriptionSender.setContextUserPrefix("PAGE");
        subscriptionSender.setFrom("info@localhost.com", "Admin");
        subscriptionSender.setHtmlFormat(true);
        subscriptionSender.setMailId(
            "indice", indice.getResourcePrimKey());
        subscriptionSender.setPortletId(PortletKeys.INDICE);
        subscriptionSender.setReplyToAddress("info@localhost.com");
        subscriptionSender.setScopeGroupId(groupId);
        subscriptionSender.setServiceContext(serviceContext);
        subscriptionSender.setSubject(subject);
        subscriptionSender.setUserId(userId);
        List subscriptions = SubscriptionLocalServiceUtil.getSubscriptions( group.getCompanyId(),
                    Indice.class.getName(), indice.getResourcePrimKey());
 
        for(Subscription subscription:subscriptions){  
            User u = UserLocalServiceUtil.getUser(subscription.getUserId());
 
            subscriptionSender.addRuntimeSubscribers(u.getEmailAddress(), u.getFullName());
        }          
        subscriptionSender.flushNotificationsAsync();
    }
...

Así, sólo tenemos que crear un SubscriptionSender, rellenarlo con los datos (cuerpo del mensaje, asunto, etc.) y después añadir cada uno de los usuarios subscriptores (los cuales recorremos dentro del bucle). Por último, llamamos a la función flushNotificationsAsync que se encarga de avisar a liferay para que realice el envío.

Espero que os haya servido de ayuda como iniciación al sistema de subscripciones. Ahora está en vuestra mano investigar qué otras opciones y métodos ofrecen las clases usadas en este artículo.

Hasta la próxima!


Leave a Reply

Your email address will not be published. Required fields are marked *