Search in sources :

Example 1 with LocalServerListener

use of jgnash.engine.message.LocalServerListener in project jgnash by ccavanaugh.

the class JpaNetworkServer method run.

private boolean run(final DataStoreType dataStoreType, final String fileName, final int port, final char[] password) {
    boolean result = false;
    final DistributedLockServer distributedLockServer = new DistributedLockServer(port + LOCK_SERVER_INCREMENT);
    final boolean lockServerStarted = distributedLockServer.startServer(password);
    final AttachmentTransferServer attachmentTransferServer = new AttachmentTransferServer(port + TRANSFER_SERVER_INCREMENT, AttachmentUtils.getAttachmentDirectory(Paths.get(fileName)));
    final boolean attachmentServerStarted = attachmentTransferServer.startServer(password);
    if (attachmentServerStarted && lockServerStarted) {
        final Engine engine = createEngine(dataStoreType, fileName, port, password);
        if (engine != null) {
            // Start the message bus and pass the file name so it can be reported to the client
            final MessageBusServer messageBusServer = new MessageBusServer(port + MESSAGE_SERVER_INCREMENT);
            result = messageBusServer.startServer(dataStoreType, fileName, password);
            if (result) {
                // don't continue if the server is not started successfully
                // Start the backup thread that ensures an XML backup is created at set intervals
                final ScheduledExecutorService backupExecutor = Executors.newSingleThreadScheduledExecutor(new DefaultDaemonThreadFactory());
                // run commit every backup period after startup
                backupExecutor.scheduleWithFixedDelay(() -> {
                    if (dirty) {
                        exportXML(engine, fileName);
                        EngineFactory.removeOldCompressedXML(fileName, engine.getRetainedBackupLimit());
                        dirty = false;
                    }
                }, BACKUP_PERIOD, BACKUP_PERIOD, TimeUnit.HOURS);
                final LocalServerListener listener = event -> {
                    if (event.startsWith(STOP_SERVER_MESSAGE)) {
                        logger.info("Remote shutdown request was received");
                        stopServer();
                    }
                    dirty = true;
                };
                messageBusServer.addLocalListener(listener);
                // wait here forever
                try {
                    while (!stop) {
                        // check for condition, handle a spurious wake up
                        // wait forever for notify() from stopServer()
                        wait();
                    }
                } catch (final InterruptedException ex) {
                    logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
                }
                messageBusServer.removeLocalListener(listener);
                backupExecutor.shutdown();
                exportXML(engine, fileName);
                messageBusServer.stopServer();
                EngineFactory.closeEngine(SERVER_ENGINE);
                EngineFactory.removeOldCompressedXML(fileName, engine.getRetainedBackupLimit());
                distributedLockManager.disconnectFromServer();
                distributedAttachmentManager.disconnectFromServer();
                distributedLockServer.stopServer();
                attachmentTransferServer.stopServer();
                em.close();
                factory.close();
            }
        }
    } else {
        if (lockServerStarted) {
            distributedLockServer.stopServer();
        }
        if (attachmentServerStarted) {
            attachmentTransferServer.stopServer();
        }
    }
    return result;
}
Also used : Engine(jgnash.engine.Engine) Persistence(javax.persistence.Persistence) EngineFactory(jgnash.engine.EngineFactory) AttachmentTransferServer(jgnash.engine.attachment.AttachmentTransferServer) LocalServerListener(jgnash.engine.message.LocalServerListener) ArrayList(java.util.ArrayList) Level(java.util.logging.Level) SQLException(java.sql.SQLException) DefaultDaemonThreadFactory(jgnash.util.DefaultDaemonThreadFactory) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) MessageBusServer(jgnash.engine.message.MessageBusServer) Path(java.nio.file.Path) Properties(java.util.Properties) AttachmentUtils(jgnash.engine.AttachmentUtils) DistributedAttachmentManager(jgnash.engine.attachment.DistributedAttachmentManager) Files(java.nio.file.Files) FileMagic(jgnash.util.FileMagic) IOException(java.io.IOException) EntityManager(javax.persistence.EntityManager) DistributedLockManager(jgnash.engine.concurrent.DistributedLockManager) Logger(java.util.logging.Logger) Executors(java.util.concurrent.Executors) StoredObject(jgnash.engine.StoredObject) TimeUnit(java.util.concurrent.TimeUnit) List(java.util.List) Paths(java.nio.file.Paths) EntityManagerFactory(javax.persistence.EntityManagerFactory) FileUtils(jgnash.util.FileUtils) DistributedLockServer(jgnash.engine.concurrent.DistributedLockServer) DataStoreType(jgnash.engine.DataStoreType) MessageBusServer(jgnash.engine.message.MessageBusServer) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) LocalServerListener(jgnash.engine.message.LocalServerListener) DistributedLockServer(jgnash.engine.concurrent.DistributedLockServer) DefaultDaemonThreadFactory(jgnash.util.DefaultDaemonThreadFactory) AttachmentTransferServer(jgnash.engine.attachment.AttachmentTransferServer) Engine(jgnash.engine.Engine)

Aggregations

IOException (java.io.IOException)1 Files (java.nio.file.Files)1 Path (java.nio.file.Path)1 Paths (java.nio.file.Paths)1 SQLException (java.sql.SQLException)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 Properties (java.util.Properties)1 Executors (java.util.concurrent.Executors)1 ScheduledExecutorService (java.util.concurrent.ScheduledExecutorService)1 TimeUnit (java.util.concurrent.TimeUnit)1 Level (java.util.logging.Level)1 Logger (java.util.logging.Logger)1 EntityManager (javax.persistence.EntityManager)1 EntityManagerFactory (javax.persistence.EntityManagerFactory)1 Persistence (javax.persistence.Persistence)1 AttachmentUtils (jgnash.engine.AttachmentUtils)1 DataStoreType (jgnash.engine.DataStoreType)1 Engine (jgnash.engine.Engine)1 EngineFactory (jgnash.engine.EngineFactory)1