2 * Copyright (C) 2014 Red Hat, Inc.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 * Authors : Dave Tucker, Flavio Fernandes
11 package org.opendaylight.ovsdb.openstack.netvirt.impl;
13 import org.opendaylight.ovsdb.openstack.netvirt.AbstractEvent;
14 import org.opendaylight.ovsdb.openstack.netvirt.AbstractHandler;
15 import org.opendaylight.ovsdb.openstack.netvirt.ConfigInterface;
16 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
17 import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
19 import org.osgi.framework.BundleContext;
20 import org.osgi.framework.ServiceReference;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
24 import java.util.concurrent.BlockingQueue;
25 import java.util.concurrent.ExecutorService;
26 import java.util.concurrent.Executors;
27 import java.util.concurrent.LinkedBlockingQueue;
28 import java.util.concurrent.TimeUnit;
30 public class EventDispatcherImpl implements EventDispatcher, ConfigInterface {
31 static final Logger logger = LoggerFactory.getLogger(EventDispatcher.class);
32 private ExecutorService eventHandler;
33 private volatile BlockingQueue<AbstractEvent> events;
34 private AbstractHandler[] handlers;
36 public EventDispatcherImpl() {
37 events = new LinkedBlockingQueue<>();
38 handlers = new AbstractHandler[AbstractEvent.HandlerType.size];
39 eventHandler = Executors.newSingleThreadExecutor();
44 eventHandler.submit(new Runnable() {
47 Thread t = Thread.currentThread();
48 t.setName("EventDispatcherImpl");
49 logger.info("EventDispatcherImpl: started {}", t.getName());
54 } catch (InterruptedException e) {
55 logger.info("The event handler thread was interrupted, shutting down", e);
60 } catch (Exception e) {
61 logger.error("Exception in dispatching event "+ev.toString(), e);
66 logger.debug("event dispatcher is started");
70 // stop accepting new tasks
71 eventHandler.shutdown();
73 // Wait a while for existing tasks to terminate
74 if (!eventHandler.awaitTermination(10, TimeUnit.SECONDS)) {
75 eventHandler.shutdownNow();
76 // Wait a while for tasks to respond to being cancelled
77 if (!eventHandler.awaitTermination(10, TimeUnit.SECONDS)) {
78 logger.error("Dispatcher's event handler did not terminate");
81 } catch (InterruptedException e) {
82 // (Re-)Cancel if current thread also interrupted
83 eventHandler.shutdownNow();
84 // Preserve interrupt status
85 Thread.currentThread().interrupt();
87 logger.debug("event dispatcher is stopped");
90 private void dispatchEvent(AbstractEvent ev) {
91 AbstractHandler handler = handlers[ev.getHandlerType().ordinal()];
92 if (handler == null) {
93 logger.warn("event dispatcher found no handler for {}", ev);
97 handler.processEvent(ev);
100 public void eventHandlerAdded(final ServiceReference ref, AbstractHandler handler){
101 Long pid = (Long) ref.getProperty(org.osgi.framework.Constants.SERVICE_ID);
102 Object handlerTypeObject = ref.getProperty(Constants.EVENT_HANDLER_TYPE_PROPERTY);
103 if (!(handlerTypeObject instanceof AbstractEvent.HandlerType)){
104 logger.error("Abstract handler reg failed to provide a valid handler type: {} ref: {} handler: {}",
105 handlerTypeObject, ref.getClass().getName(), handler.getClass().getName());
108 AbstractEvent.HandlerType handlerType = (AbstractEvent.HandlerType) handlerTypeObject;
109 handlers[handlerType.ordinal()] = handler;
110 logger.info("eventHandlerAdded: handler: {}, pid: {}, type: {}",
111 handler.getClass().getName(), pid, handlerType);
114 public void eventHandlerRemoved(final ServiceReference ref){
115 Long pid = (Long) ref.getProperty(org.osgi.framework.Constants.SERVICE_ID);
116 Object handlerTypeObject = ref.getProperty(Constants.EVENT_HANDLER_TYPE_PROPERTY);
117 if (!(handlerTypeObject instanceof AbstractEvent.HandlerType)){
118 logger.error("Abstract handler unreg failed to provide a valid handler type " + handlerTypeObject);
121 AbstractEvent.HandlerType handlerType = (AbstractEvent.HandlerType) handlerTypeObject;
122 handlers[handlerType.ordinal()] = null;
123 logger.debug("Event handler for type {} unregistered pid {}", handlerType, pid);
129 * @param event the {@link org.opendaylight.ovsdb.openstack.netvirt.AbstractEvent} event to be handled.
132 public void enqueueEvent(AbstractEvent event) {
134 logger.warn("enqueueEvent: event is null");
140 } catch (InterruptedException e) {
141 logger.error("Thread was interrupted while trying to enqueue event ", e);
146 public void setDependencies(BundleContext bundleContext, ServiceReference serviceReference) {}
149 public void setDependencies(Object impl) {}