package com.neverwinterdp.scribengin.dataflow.service; import java.util.Map; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; 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.vm.VMApp; import com.neverwinterdp.vm.VMConfig; public class VMDataflowServiceApp extends VMApp { private String dataflowRegistryPath; private LeaderElection election; private DataflowService dataflowService; private Injector appContainer; private ServiceRunnerThread serviceRunnerThread; @Override public void run() throws Exception { VMConfig vmConfig = getVM().getDescriptor().getVmConfig(); dataflowRegistryPath = vmConfig.getProperties().get("dataflow.registry.path"); election = new LeaderElection(getVM().getVMRegistry().getRegistry(), dataflowRegistryPath + "/master/leader") ; election.setListener(new MasterLeaderElectionListener()); election.start(); try { waitForShutdown(); System.err.println("finish 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(); final VMConfig vmConfig = getVM().getDescriptor().getVmConfig(); AppModule module = new AppModule(vmConfig.getProperties()) { @Override protected void configure(Map<String, String> properties) { bindInstance(VMConfig.class, vmConfig); bindInstance(RegistryConfig.class, registry.getRegistryConfig()); try { bindType(Registry.class, registry.getClass().getName()); Configuration conf = new Configuration(); vmConfig.overrideHadoopConfiguration(conf); FileSystem fs = FileSystem.get(conf); bindInstance(FileSystem.class, fs); } catch (Exception e) { //TODO: use logger e.printStackTrace(); } }; }; RefNode leaderRefNode = new RefNode(); leaderRefNode.setPath(getVM().getDescriptor().getStoredPath()); registry.setData(dataflowRegistryPath + "/master/leader", leaderRefNode); Module[] modules = { new CloseableModule(),new Jsr250Module(), new MycilaJmxModuleExt(getVM().getDescriptor().getVmConfig().getName()), module }; appContainer = Guice.createInjector(Stage.PRODUCTION, modules); dataflowService = appContainer.getInstance(DataflowService.class); serviceRunnerThread = new ServiceRunnerThread(dataflowService); serviceRunnerThread.start(); } catch(Exception e) { e.printStackTrace(); } } } public class ServiceRunnerThread extends Thread { DataflowService service; ServiceRunnerThread(DataflowService service) { this.service = service; } public void run() { try { service.run(); } catch (Exception e) { e.printStackTrace(); } finally { System.err.println("ServiceRunnerThread: notifyShutdown()"); notifyShutdown(); } } } }