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 port) throws 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[] args) throws 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 }
|