1 package org.apache.commons.jcs.auxiliary.remote.server;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.rmi.Naming;
23 import java.rmi.Remote;
24 import java.rmi.RemoteException;
25 import java.rmi.registry.Registry;
26
27 import org.apache.commons.jcs.auxiliary.remote.RemoteUtils;
28 import org.apache.commons.jcs.engine.logging.behavior.ICacheEventLogger;
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31
32
33
34
35
36 public class RegistryKeepAliveRunner
37 implements Runnable
38 {
39
40 private static final Log log = LogFactory.getLog( RegistryKeepAliveRunner.class );
41
42
43 private String namingURL;
44
45
46 private String serviceName;
47
48
49 private int registryPort;
50
51
52 private ICacheEventLogger cacheEventLogger;
53
54
55 private Registry registry;
56
57
58
59
60
61
62 public RegistryKeepAliveRunner( String registryHost, int registryPort, String serviceName )
63 {
64 this.namingURL = RemoteUtils.getNamingURL(registryHost, registryPort, serviceName);
65 this.serviceName = serviceName;
66 this.registryPort = registryPort;
67 }
68
69
70
71
72
73
74 @Override
75 public void run()
76 {
77 checkAndRestoreIfNeeded();
78 }
79
80
81
82
83
84 protected void checkAndRestoreIfNeeded()
85 {
86 if ( log.isDebugEnabled() )
87 {
88 log.debug( "looking up server " + namingURL );
89 }
90 try
91 {
92 Object obj = Naming.lookup( namingURL );
93
94
95 String message = "RMI registry looks fine. Found [" + obj + "] in registry [" + namingURL + "]";
96 if ( cacheEventLogger != null )
97 {
98 cacheEventLogger.logApplicationEvent( "RegistryKeepAliveRunner", "Naming.lookup", message );
99 }
100 if ( log.isDebugEnabled() )
101 {
102 log.debug( message );
103 }
104 }
105 catch ( Exception ex )
106 {
107
108 String message = "Problem finding server at [" + namingURL
109 + "]. Will attempt to start registry and rebind.";
110 log.error( message, ex );
111 if ( cacheEventLogger != null )
112 {
113 cacheEventLogger.logError( "RegistryKeepAliveRunner", "Naming.lookup", message + ":" + ex.getMessage() );
114 }
115 createAndRegister( serviceName );
116 }
117 }
118
119
120
121
122
123
124 protected void createAndRegister( String serviceName )
125 {
126 createReqistry( serviceName );
127 registerServer( serviceName );
128 }
129
130
131
132
133
134
135 protected void createReqistry( String serviceName )
136 {
137
138 this.registry = RemoteUtils.createRegistry(registryPort);
139
140 if ( cacheEventLogger != null )
141 {
142 if (this.registry != null)
143 {
144 cacheEventLogger.logApplicationEvent( "RegistryKeepAliveRunner", "createRegistry",
145 "Successfully created registry [" + serviceName + "]." );
146 }
147 else
148 {
149 cacheEventLogger.logError( "RegistryKeepAliveRunner", "createRegistry",
150 "Could not start registry [" + serviceName + "]." );
151 }
152 }
153 }
154
155
156
157
158
159
160 protected void registerServer( String serviceName )
161 {
162 try
163 {
164
165 Remote server = RemoteCacheServerFactory.getRemoteCacheServer();
166
167 if ( server == null )
168 {
169 throw new RemoteException( "Cannot register the server until it is created." );
170 }
171
172 this.registry.rebind( serviceName, server );
173 String message = "Successfully rebound server to registry [" + serviceName + "].";
174 if ( cacheEventLogger != null )
175 {
176 cacheEventLogger.logApplicationEvent( "RegistryKeepAliveRunner", "registerServer", message );
177 }
178 if ( log.isInfoEnabled() )
179 {
180 log.info( message );
181 }
182 }
183 catch ( RemoteException e )
184 {
185 String message = "Could not rebind server to registry [" + serviceName + "].";
186 log.error( message, e );
187 if ( cacheEventLogger != null )
188 {
189 cacheEventLogger.logError( "RegistryKeepAliveRunner", "registerServer", message + ":"
190 + e.getMessage() );
191 }
192 }
193 }
194
195
196
197
198
199
200 public void setCacheEventLogger( ICacheEventLogger cacheEventLogger )
201 {
202 this.cacheEventLogger = cacheEventLogger;
203 }
204 }