Main.java
001 /*
002  *
003  * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved.
004  *
005  */
006 package demo.sharedqueue;
007 
008 import java.io.File;
009 import java.net.InetAddress;
010 import java.net.UnknownHostException;
011 
012 import org.mortbay.jetty.Connector;
013 import org.mortbay.jetty.Handler;
014 import org.mortbay.jetty.Server;
015 import org.mortbay.jetty.bio.SocketConnector;
016 import org.mortbay.jetty.handler.ContextHandler;
017 import org.mortbay.jetty.handler.HandlerCollection;
018 import org.mortbay.jetty.handler.ResourceHandler;
019 
020 import com.tc.cluster.DsoCluster;
021 import com.tc.cluster.DsoClusterEvent;
022 import com.tc.cluster.DsoClusterListener;
023 import com.tc.injection.annotations.InjectedDsoInstance;
024 import com.tcclient.cluster.DsoNode;
025 
026 public class Main implements DsoClusterListener {
027 
028    private final File cwd = new File(System.getProperty("user.dir"));
029 
030    private int lastPortUsed;
031    private demo.sharedqueue.Queue queue;
032    private Worker worker;
033 
034    @InjectedDsoInstance
035    private DsoCluster cluster;
036 
037    public final void start(int portthrows Exception {
038       cluster.addClusterListener(this);
039 
040       DsoNode node = cluster.getCurrentNode();
041       port = setPort(port);
042 
043       System.out.println("DSO SharedQueue (node " + node + ")");
044       System.out.println("Open your browser and go to - http://"
045             + getHostName() ":" + port + "/webapp\n");
046 
047       Server server = new Server();
048       Connector connector = new SocketConnector();
049       connector.setPort(port);
050       server.setConnectors(new Connector[] { connector });
051 
052       queue = new Queue(port);
053       worker = queue.createWorker(node);
054 
055       ResourceHandler resourceHandler = new ResourceHandler();
056       resourceHandler.setResourceBase(".");
057 
058       ContextHandler ajaxContext = new ContextHandler();
059       ajaxContext.setContextPath(SimpleHttpHandler.ACTION);
060       ajaxContext.setResourceBase(cwd.getPath());
061       ajaxContext.setClassLoader(Thread.currentThread()
062             .getContextClassLoader());
063       ajaxContext.addHandler(new SimpleHttpHandler(queue));
064 
065       HandlerCollection handlers = new HandlerCollection();
066       handlers.setHandlers(new Handler[] { ajaxContext, resourceHandler });
067       server.setHandler(handlers);
068 
069       startReaper();
070       server.start();
071       server.join();
072    }
073 
074    private final int setPort(int port) {
075       if (port == -1) {
076          if (lastPortUsed == 0) {
077             port = lastPortUsed = 1990;
078          else {
079             port = ++lastPortUsed;
080          }
081       else {
082          lastPortUsed = port;
083       }
084       return port;
085    }
086 
087    /**
088     * Starts a thread to identify dead workers (From nodes that have been
089     * brought down) and removes them from the (shared) list of workers.
090     */
091    private final void startReaper() {
092       Thread reaper = new Thread(new Runnable() {
093          public void run() {
094             while (true) {
095                queue.reap();
096                try {
097                   Thread.sleep(1000);
098                catch (InterruptedException ie) {
099                   System.err.println(ie.getMessage());
100                }
101             }
102          }
103       });
104       reaper.start();
105    }
106 
107    public final static void main(final String[] argsthrows Exception {
108       int port = -1;
109       try {
110          port = Integer.parseInt(args[0]);
111       catch (Exception e) {
112       }
113       new Main().start(port);
114    }
115 
116    static final String getHostName() {
117       try {
118          InetAddress addr = InetAddress.getLocalHost();
119          return addr.getHostAddress();
120       catch (UnknownHostException e) {
121          return "Unknown";
122       }
123    }
124 
125    public void nodeLeft(final DsoClusterEvent event) {
126       DsoNode node = event.getNode();
127       Worker worker = queue.getWorker(node);
128       if (worker != null) {
129          worker.markForExpiration();
130       else {
131          System.err.println("Worker for node: " + node + " not found.");
132       }
133    }
134 
135    public void nodeJoined(final DsoClusterEvent event) {
136       // unused
137    }
138 
139    public void operationsDisabled(final DsoClusterEvent event) {
140       // unused
141    }
142 
143    public void operationsEnabled(final DsoClusterEvent event) {
144       // unused
145    }
146 }