Author: rareddy
Date: 2009-10-01 12:00:08 -0400 (Thu, 01 Oct 2009)
New Revision: 1512
Modified:
trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java
Log:
TEIID-867: Adding the ping support from the local connection. Even though technically
local connections do not require ping, engine code does not distinguish between embedded
vs socket connection, so server contract must be followed.
Modified: trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java 2009-10-01
14:46:23 UTC (rev 1511)
+++ trunk/runtime/src/main/java/org/teiid/transport/LocalServerConnection.java 2009-10-01
16:00:08 UTC (rev 1512)
@@ -27,6 +27,8 @@
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Properties;
+import java.util.Timer;
+import java.util.TimerTask;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
@@ -56,7 +58,10 @@
private ClassLoader classLoader;
ClientServiceRegistry clientServices;
SessionServiceInterface sessionService;
+ private Timer pingTimer;
+ private ILogon logon;
+
public LocalServerConnection(Properties connectionProperties, ClientServiceRegistry
clientServices, SessionServiceInterface sessionService) throws CommunicationException,
ConnectionException{
@@ -71,11 +76,37 @@
this.classLoader = Thread.currentThread().getContextClassLoader();
this.sessionService = sessionService;
+
+ this.logon = this.getService(ILogon.class);
+ this.pingTimer = new Timer("LocalPing", true); //$NON-NLS-1$
+
+ schedulePing();
}
+
+ private void schedulePing() {
+ if (this.pingTimer != null) {
+ this.pingTimer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ try {
+ if (isOpen()) {
+ logon.ping();
+ return;
+ }
+ } catch (InvalidSessionException e) {
+ shutdown(false);
+ } catch (MetaMatrixComponentException e) {
+ shutdown();
+ }
+ this.cancel();
+ }
+ }, PING_INTERVAL, PING_INTERVAL);
+ }
+ }
public synchronized LogonResult authenticate(Properties connProps) throws
ConnectionException, CommunicationException {
try {
- LogonResult logonResult = getService(ILogon.class).logon(connProps);
+ LogonResult logonResult = this.logon.logon(connProps);
return logonResult;
} catch (LogonException e) {
// Propagate the original message as it contains the message we want
@@ -126,26 +157,31 @@
}
public void shutdown() {
+ shutdown(true);
+ }
+
+ private void shutdown(boolean logoff) {
if (shutdown) {
return;
}
- try {
- //make a best effort to send the logoff
- Future<?> writeFuture = getService(ILogon.class).logoff();
- if (writeFuture != null) {
- writeFuture.get(5000, TimeUnit.MILLISECONDS);
+ if (logoff) {
+ try {
+ //make a best effort to send the logoff
+ Future<?> writeFuture = this.logon.logoff();
+ if (writeFuture != null) {
+ writeFuture.get(5000, TimeUnit.MILLISECONDS);
+ }
+ } catch (InvalidSessionException e) {
+ //ignore
+ } catch (InterruptedException e) {
+ //ignore
+ } catch (ExecutionException e) {
+ //ignore
+ } catch (TimeoutException e) {
+ //ignore
}
- } catch (InvalidSessionException e) {
- //ignore
- } catch (InterruptedException e) {
- //ignore
- } catch (ExecutionException e) {
- //ignore
- } catch (TimeoutException e) {
- //ignore
}
-
this.shutdown = true;
}
Show replies by date