org.wso2.carbon.identity.notification.mgt.EventDistributionTask.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.identity.notification.mgt.EventDistributionTask.java

Source

/*
 *
 * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * WSO2 Inc. licenses this file to you under the Apache License,
 *  Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.wso2.carbon.identity.notification.mgt;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.identity.notification.mgt.bean.PublisherEvent;
import org.wso2.carbon.identity.notification.mgt.internal.NotificationManagementServiceDataHolder;

import java.util.List;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * This has a queue inside. All publishers add events to this queue and this event distribution task is responsible
 * for distributing these events to Notification sending modules
 */
public class EventDistributionTask implements Runnable {

    private static final Log log = LogFactory.getLog(NotificationSender.class);

    /**
     * Queue used to add events by publishers.
     */
    private BlockingDeque<PublisherEvent> eventQueue;
    /**
     * Registered message sending modules.
     */
    private List<NotificationSendingModule> notificationSendingModules;
    /**
     * Condition to break event distribution task
     */
    private volatile boolean running;

    /**
     * Overridden constructor to initiate notification sending modules and thread pool size
     *
     * @param notificationSendingModules List of notification sending modules registered
     * @param threadPoolSize             Size of thread pool for notification sending components
     */
    public EventDistributionTask(List<NotificationSendingModule> notificationSendingModules, int threadPoolSize) {
        this.notificationSendingModules = notificationSendingModules;
        this.eventQueue = new LinkedBlockingDeque<PublisherEvent>();
        NotificationManagementServiceDataHolder.getInstance()
                .setThreadPool(Executors.newFixedThreadPool(threadPoolSize));
    }

    public void addEventToQueue(PublisherEvent publisherEvent) {
        this.eventQueue.add(publisherEvent);
    }

    @Override
    public void run() {
        running = true;
        // Run forever until stop the bundle. Will stop in eventQueue.take()
        while (running) {
            try {
                final PublisherEvent event = eventQueue.take();
                for (final NotificationSendingModule module : notificationSendingModules) {
                    // If the module is subscribed to the event, module will be executed.
                    try {
                        if (module.isSubscribed(event)) {
                            // Create a runnable and submit to the thread pool for sending message.
                            Runnable msgSender = new Runnable() {
                                @Override
                                public void run() {
                                    if (log.isDebugEnabled()) {
                                        log.debug("Executing " + module.getModuleName() + " on event"
                                                + event.getEventName());
                                    }
                                    try {
                                        module.sendMessage(event);
                                    } catch (NotificationManagementException e) {
                                        log.error("Error while invoking notification sending module "
                                                + module.getModuleName(), e);
                                    }
                                }
                            };
                            NotificationManagementServiceDataHolder.getInstance().getThreadPool().submit(msgSender);
                        }
                    } catch (NotificationManagementException e) {
                        log.error("Error while getting subscription status from notification module "
                                + module.getModuleName(), e);
                    }
                }
            } catch (InterruptedException e) {
                log.error("Error while picking up event from event queue", e);
            }
        }
    }

    public void shutdown() {
        this.running = false;
    }
}