Fixed synchronization issues

This commit is contained in:
Ziver Koc 2020-12-09 00:20:47 +01:00
parent d7a14a4899
commit 907e8ee498
2 changed files with 37 additions and 28 deletions

View file

@ -43,21 +43,30 @@ public class HalServer {
public static void main(String[] args) { public static void main(String[] args) {
try { try {
// ------------------------------------
// Initialize Hal
// ------------------------------------
// init logging // init logging
LogUtil.readConfiguration("logging.properties"); LogUtil.readConfiguration("logging.properties");
// init DB and other configurations // init DB and other configurations
HalContext.initialize(); HalContext.initialize();
DBConnection db = HalContext.getDB();
logger.info("Working directory: " + FileUtil.find(".").getAbsolutePath()); logger.info("Working directory: " + FileUtil.find(".").getAbsolutePath());
// init variables
pluginManager = new PluginManager();
daemonExecutor = Executors.newScheduledThreadPool(1); // We set only one thread for easier troubleshooting
http = new HttpServer(HalContext.getIntegerProperty(HalContext.PROPERTY_HTTP_PORT));
DBConnection db = HalContext.getDB();
// ------------------------------------ // ------------------------------------
// Init Plugins // Initialize Plugins
// ------------------------------------ // ------------------------------------
logger.info("Looking for plugins."); logger.info("Looking for plugins.");
pluginManager = new PluginManager();
// Disable plugins based on settings // Disable plugins based on settings
for (PluginData plugin : getAllPlugins()) { for (PluginData plugin : getAllPlugins()) {
@ -70,7 +79,7 @@ public class HalServer {
} }
// ------------------------------------ // ------------------------------------
// Init Managers // Initialize Managers
// ------------------------------------ // ------------------------------------
logger.info("Initializing managers."); logger.info("Initializing managers.");
@ -102,11 +111,8 @@ public class HalServer {
logger.info("Initializing daemons."); logger.info("Initializing daemons.");
// We set only one thread for easier troubleshooting
daemonExecutor = Executors.newScheduledThreadPool(1);
for (Iterator<HalDaemon> it = pluginManager.getSingletonIterator(HalDaemon.class); it.hasNext(); ) { for (Iterator<HalDaemon> it = pluginManager.getSingletonIterator(HalDaemon.class); it.hasNext(); ) {
HalDaemon daemon = it.next(); HalDaemon daemon = it.next();
logger.info("Registering daemon: " + daemon.getClass());
registerDaemon(daemon); registerDaemon(daemon);
} }
@ -120,7 +126,6 @@ public class HalServer {
HalWebPage.getRootNav().createSubNav("Events").setWeight(100); HalWebPage.getRootNav().createSubNav("Events").setWeight(100);
HalWebPage.getRootNav().createSubNav("Settings").setWeight(200); HalWebPage.getRootNav().createSubNav("Settings").setWeight(200);
http = new HttpServer(HalContext.getIntegerProperty(HalContext.PROPERTY_HTTP_PORT));
http.setDefaultPage(new HttpFilePage(FileUtil.find(HalContext.RESOURCE_WEB_ROOT))); http.setDefaultPage(new HttpFilePage(FileUtil.find(HalContext.RESOURCE_WEB_ROOT)));
http.setPage("/", new HttpRedirectPage("/map")); http.setPage("/", new HttpRedirectPage("/map"));
http.setPage(HalAlertManager.getInstance().getUrl(), HalAlertManager.getInstance()); http.setPage(HalAlertManager.getInstance().getUrl(), HalAlertManager.getInstance());
@ -164,6 +169,7 @@ public class HalServer {
public static void registerDaemon(HalDaemon daemon){ public static void registerDaemon(HalDaemon daemon){
logger.info("Registering daemon: " + daemon.getClass());
daemons.add(daemon); daemons.add(daemon);
daemon.initiate(daemonExecutor); daemon.initiate(daemonExecutor);
} }

View file

@ -1,5 +1,6 @@
package se.hal.plugin.dummy; package se.hal.plugin.dummy;
import se.hal.HalServer;
import se.hal.intf.*; import se.hal.intf.*;
import java.util.ArrayList; import java.util.ArrayList;
@ -7,9 +8,8 @@ import java.util.List;
import java.util.concurrent.*; import java.util.concurrent.*;
public class DummyController implements HalSensorController, HalEventController, Runnable { public class DummyController implements HalSensorController, HalEventController, Runnable, HalDaemon {
private List<DummyDevice> registeredDevices = new ArrayList(); private List<DummyDevice> registeredDevices = new ArrayList();
private ScheduledExecutorService executor;
private HalSensorReportListener sensorListener; private HalSensorReportListener sensorListener;
private HalEventReportListener eventListener; private HalEventReportListener eventListener;
@ -19,54 +19,57 @@ public class DummyController implements HalSensorController, HalEventController,
@Override @Override
public void initialize() { public void initialize() {
executor = Executors.newScheduledThreadPool(1); HalServer.registerDaemon(this);
}
@Override
public void initiate(ScheduledExecutorService executor) {
executor.scheduleAtFixedRate(this, 0, 60, TimeUnit.SECONDS); executor.scheduleAtFixedRate(this, 0, 60, TimeUnit.SECONDS);
} }
@Override @Override
public void run() { public synchronized void run() {
if (registeredDevices != null) { try {
for (DummyDevice device : registeredDevices) { for (DummyDevice device : registeredDevices) {
if (sensorListener != null) { HalDeviceData data = device.generateData();
HalDeviceData data = device.generateData();
if (data instanceof HalSensorData) { if (sensorListener != null && data instanceof HalSensorData) {
sensorListener.reportReceived((HalSensorConfig) device, (HalSensorData) data); sensorListener.reportReceived((HalSensorConfig) device, (HalSensorData) data);
} else if (data instanceof HalEventData) { } else if (eventListener != null && data instanceof HalEventData) {
eventListener.reportReceived((HalEventConfig) device, (HalEventData) data); eventListener.reportReceived((HalEventConfig) device, (HalEventData) data);
}
} }
} }
} catch (Exception e) {
e.printStackTrace();
} }
} }
@Override @Override
public void register(HalSensorConfig sensorConfig) { public synchronized void register(HalSensorConfig sensorConfig) {
if (sensorConfig instanceof DummyDevice) { if (sensorConfig instanceof DummyDevice) {
registeredDevices.add((DummyDevice) sensorConfig); registeredDevices.add((DummyDevice) sensorConfig);
} }
} }
@Override @Override
public void register(HalEventConfig eventConfig) { public synchronized void register(HalEventConfig eventConfig) {
if (eventConfig instanceof DummyDevice) { if (eventConfig instanceof DummyDevice) {
registeredDevices.add((DummyDevice) eventConfig); registeredDevices.add((DummyDevice) eventConfig);
} }
} }
@Override @Override
public void deregister(HalSensorConfig sensorConfig) { public synchronized void deregister(HalSensorConfig sensorConfig) {
registeredDevices.remove(sensorConfig); registeredDevices.remove(sensorConfig);
} }
@Override @Override
public void deregister(HalEventConfig eventConfig) { public synchronized void deregister(HalEventConfig eventConfig) {
registeredDevices.remove(eventConfig); registeredDevices.remove(eventConfig);
} }
@Override @Override
public void send(HalEventConfig eventConfig, HalEventData eventData) { public synchronized void send(HalEventConfig eventConfig, HalEventData eventData) {
// Nothing to do as this is a dummy // Nothing to do as this is a dummy
} }
@ -82,7 +85,7 @@ public class DummyController implements HalSensorController, HalEventController,
public void setListener(HalEventReportListener listener) { eventListener = listener; } public void setListener(HalEventReportListener listener) { eventListener = listener; }
@Override @Override
public void close() { public synchronized void close() {
executor.shutdown(); registeredDevices = new ArrayList();
} }
} }