package com.neverwinterdp.scribengin.service; import java.util.Map; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.Stage; import com.mycila.guice.ext.closeable.CloseableModule; import com.mycila.guice.ext.jsr250.Jsr250Module; import com.neverwinterdp.module.AppModule; import com.neverwinterdp.module.MycilaJmxModuleExt; import com.neverwinterdp.registry.RefNode; import com.neverwinterdp.registry.Registry; import com.neverwinterdp.registry.RegistryConfig; import com.neverwinterdp.registry.election.LeaderElection; import com.neverwinterdp.registry.election.LeaderElectionListener; import com.neverwinterdp.scribengin.event.ScribenginShutdownEventListener; import com.neverwinterdp.vm.VMApp; import com.neverwinterdp.vm.VMConfig; import com.neverwinterdp.vm.client.VMClient; public class VMScribenginServiceApp extends VMApp { private LeaderElection election ; private Injector appContainer ; private ScribenginService scribenginService; public ScribenginService getScribenginService() { return this.scribenginService ; } @Override public void run() throws Exception { Registry registry = getVM().getVMRegistry().getRegistry(); getVM().getVMRegistry().getRegistry().createIfNotExist(ScribenginService.LEADER_PATH) ; RefNode masterVMRef = new RefNode(getVM().getDescriptor().getStoredPath()) ; election = new LeaderElection(getVM().getVMRegistry().getRegistry(), ScribenginService.LEADER_PATH, masterVMRef) ; election.setListener(new MasterLeaderElectionListener()); election.start(); ScribenginShutdownEventListener shutdownListener = new ScribenginShutdownEventListener(registry) { @Override public void onShutdownEvent() { notifyShutdown(); } }; try { waitForShutdown(); } catch(InterruptedException ex) { } finally { if(election != null && election.getLeaderId() != null) { election.stop(); } } } class MasterLeaderElectionListener implements LeaderElectionListener { @Override public void onElected() { try { final Registry registry = getVM().getVMRegistry().getRegistry(); AppModule module = new AppModule(getVM().getDescriptor().getVmConfig().getProperties()) { @Override protected void configure(Map<String, String> properties) { bindInstance(RegistryConfig.class, registry.getRegistryConfig()); try { bindType(Registry.class, registry.getClass().getName()); bindInstance(VMConfig.class, getVM().getDescriptor().getVmConfig()); bindInstance(VMClient.class, new VMClient(registry)); } catch (ClassNotFoundException e) { //TODO: use logger e.printStackTrace(); } }; }; Module[] modules = { new CloseableModule(),new Jsr250Module(), new MycilaJmxModuleExt(getVM().getDescriptor().getVmConfig().getName()), module }; appContainer = Guice.createInjector(Stage.PRODUCTION, modules); scribenginService = appContainer.getInstance(ScribenginService.class); RefNode refNode = new RefNode() ; refNode.setPath(getVM().getDescriptor().getStoredPath()); registry.setData(ScribenginService.LEADER_PATH, refNode); } catch(Exception e) { e.printStackTrace(); } } } }