summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2007-08-29 10:43:41 (EDT)
committerEike Stepper2007-08-29 10:43:41 (EDT)
commitbce5eb47eef0b3810137fa1fb9675ed72658a4b0 (patch)
tree110adddda2767816df45074d76948171e0641267
parentfe556bf635a895e9087eacc211fcdec63c5a452f (diff)
downloadcdo-bce5eb47eef0b3810137fa1fb9675ed72658a4b0.zip
cdo-bce5eb47eef0b3810137fa1fb9675ed72658a4b0.tar.gz
cdo-bce5eb47eef0b3810137fa1fb9675ed72658a4b0.tar.bz2
[201267] failover strategy for CDO/NET4J
https://bugs.eclipse.org/bugs/show_bug.cgi?id=201267
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDORevisionManagerImpl.java11
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java141
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionPackageManager.java7
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java11
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java5
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOViewImpl.java6
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/FailOverStrategy.java93
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IFailOverEvent.java33
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IFailOverStrategy.java25
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/NOOPFailOverStrategy.java43
10 files changed, 322 insertions, 53 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDORevisionManagerImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDORevisionManagerImpl.java
index 98fb387..ba0ae0e 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDORevisionManagerImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDORevisionManagerImpl.java
@@ -16,6 +16,8 @@ import org.eclipse.emf.cdo.internal.protocol.revision.CDORevisionResolverImpl;
import org.eclipse.emf.cdo.protocol.CDOID;
import org.eclipse.emf.cdo.protocol.util.TransportException;
+import org.eclipse.net4j.signal.IFailOverStrategy;
+
import org.eclipse.emf.internal.cdo.protocol.LoadRevisionRequest;
/**
@@ -40,7 +42,9 @@ public class CDORevisionManagerImpl extends CDORevisionResolverImpl implements C
{
try
{
- return new LoadRevisionRequest(session.getChannel(), id).send();
+ IFailOverStrategy failOverStrategy = session.getFailOverStrategy();
+ LoadRevisionRequest request = new LoadRevisionRequest(session.getChannel(), id);
+ return failOverStrategy.send(request);
}
catch (RuntimeException ex)
{
@@ -57,8 +61,9 @@ public class CDORevisionManagerImpl extends CDORevisionResolverImpl implements C
{
try
{
- LoadRevisionRequest signal = new LoadRevisionRequest(session.getChannel(), id, timeStamp);
- return signal.send();
+ IFailOverStrategy failOverStrategy = session.getFailOverStrategy();
+ LoadRevisionRequest request = new LoadRevisionRequest(session.getChannel(), id, timeStamp);
+ return failOverStrategy.send(request);
}
catch (RuntimeException ex)
{
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java
index a51029b..fba42e6 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java
@@ -29,9 +29,12 @@ import org.eclipse.net4j.internal.util.container.Container;
import org.eclipse.net4j.internal.util.event.Event;
import org.eclipse.net4j.internal.util.lifecycle.LifecycleEventAdapter;
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
+import org.eclipse.net4j.signal.IFailOverEvent;
+import org.eclipse.net4j.signal.IFailOverStrategy;
import org.eclipse.net4j.util.ImplementationError;
import org.eclipse.net4j.util.WrappedException;
import org.eclipse.net4j.util.event.EventUtil;
+import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.lifecycle.ILifecycle;
@@ -72,6 +75,20 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession
private int sessionID;
+ private IFailOverStrategy failOverStrategy;
+
+ private IListener failOverStrategyListener = new IListener()
+ {
+ public void notifyEvent(IEvent event)
+ {
+ if (event instanceof IFailOverEvent)
+ {
+ IFailOverEvent e = (IFailOverEvent)event;
+ handleFailOver(e.getNewChannel());
+ }
+ }
+ };
+
private IConnector connector;
private IChannel channel;
@@ -107,9 +124,9 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession
public CDOSessionImpl(EPackage.Registry delegate)
{
- packageRegistry = new CDOPackageRegistryImpl(this, delegate);
- packageManager = new CDOSessionPackageManager(this);
- revisionManager = new CDORevisionManagerImpl(this);
+ packageRegistry = createPackageRegistry(delegate);
+ packageManager = createPackageManager();
+ revisionManager = createRevisionManager();
}
public int getSessionID()
@@ -117,6 +134,25 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession
return sessionID;
}
+ public IFailOverStrategy getFailOverStrategy()
+ {
+ return failOverStrategy == null ? IFailOverStrategy.NOOP : failOverStrategy;
+ }
+
+ public void setFailOverStrategy(IFailOverStrategy failOverStrategy)
+ {
+ if (this.failOverStrategy != null)
+ {
+ this.failOverStrategy.removeListener(failOverStrategyListener);
+ }
+
+ this.failOverStrategy = failOverStrategy;
+ if (this.failOverStrategy != null)
+ {
+ this.failOverStrategy.addListener(failOverStrategyListener);
+ }
+ }
+
public IConnector getConnector()
{
return connector;
@@ -428,6 +464,63 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession
return MessageFormat.format("CDOSession[{0}/{1}]", connector, repositoryName);
}
+ protected CDOPackageRegistryImpl createPackageRegistry(EPackage.Registry delegate)
+ {
+ return new CDOPackageRegistryImpl(this, delegate);
+ }
+
+ protected CDOSessionPackageManager createPackageManager()
+ {
+ return new CDOSessionPackageManager(this);
+ }
+
+ protected CDORevisionManagerImpl createRevisionManager()
+ {
+ return new CDORevisionManagerImpl(this);
+ }
+
+ protected ResourceSet createResourceSet()
+ {
+ return new ResourceSetImpl();
+ }
+
+ protected void attach(ResourceSet resourceSet, CDOViewImpl view)
+ {
+ if (CDOUtil.getView(resourceSet) != null)
+ {
+ throw new IllegalStateException("CDO view already open");
+ }
+
+ resourceSet.setPackageRegistry(new EPackageRegistryImpl(packageRegistry));
+ CDOUtil.prepareResourceSet(resourceSet);
+
+ Map<URI, Resource> resourceMap = null;
+ if (resourceSet instanceof ResourceSetImpl)
+ {
+ ResourceSetImpl rs = (ResourceSetImpl)resourceSet;
+ resourceMap = rs.getURIResourceMap();
+ rs.setURIResourceMap(new ProxyResolverURIResourceMap(view, resourceMap));
+ }
+ else
+ {
+ throw new ImplementationError("Not a " + ResourceSetImpl.class.getName() + ": "
+ + resourceSet.getClass().getName());
+ }
+
+ synchronized (views)
+ {
+ views.put(resourceSet, view);
+ }
+
+ resourceSet.eAdapters().add(view);
+ sendViewsNotification(view);
+ fireElementAddedEvent(view);
+ }
+
+ protected void handleFailOver(IChannel newChannel)
+ {
+ }
+
@Override
protected void doBeforeActivate() throws Exception
{
@@ -454,8 +547,10 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession
EventUtil.addListener(channel, channelListener);
+ IFailOverStrategy failOverStrategy = getFailOverStrategy();
OpenSessionRequest request = new OpenSessionRequest(channel, repositoryName);
- OpenSessionResult result = request.send();
+ OpenSessionResult result = failOverStrategy.send(request);
+
sessionID = result.getSessionID();
repositoryUUID = result.getRepositoryUUID();
packageManager.addPackageProxies(result.getPackageInfos());
@@ -483,44 +578,6 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession
super.doDeactivate();
}
- private ResourceSet createResourceSet()
- {
- return new ResourceSetImpl();
- }
-
- private void attach(ResourceSet resourceSet, CDOViewImpl view)
- {
- if (CDOUtil.getView(resourceSet) != null)
- {
- throw new IllegalStateException("CDO view already open");
- }
-
- resourceSet.setPackageRegistry(new EPackageRegistryImpl(packageRegistry));
- CDOUtil.prepareResourceSet(resourceSet);
-
- Map<URI, Resource> resourceMap = null;
- if (resourceSet instanceof ResourceSetImpl)
- {
- ResourceSetImpl rs = (ResourceSetImpl)resourceSet;
- resourceMap = rs.getURIResourceMap();
- rs.setURIResourceMap(new ProxyResolverURIResourceMap(view, resourceMap));
- }
- else
- {
- throw new ImplementationError("Not a " + ResourceSetImpl.class.getName() + ": "
- + resourceSet.getClass().getName());
- }
-
- synchronized (views)
- {
- views.put(resourceSet, view);
- }
-
- resourceSet.eAdapters().add(view);
- sendViewsNotification(view);
- fireElementAddedEvent(view);
- }
-
private void sendViewsNotification(CDOViewImpl view)
{
try
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionPackageManager.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionPackageManager.java
index a2dce90..3eb9f4a 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionPackageManager.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionPackageManager.java
@@ -17,6 +17,8 @@ import org.eclipse.emf.cdo.protocol.model.CDOPackageInfo;
import org.eclipse.emf.cdo.protocol.util.TransportException;
import org.eclipse.emf.cdo.util.EMFUtil;
+import org.eclipse.net4j.signal.IFailOverStrategy;
+
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.internal.cdo.bundle.OM;
import org.eclipse.emf.internal.cdo.protocol.LoadPackageRequest;
@@ -72,7 +74,10 @@ public class CDOSessionPackageManager extends CDOPackageManagerImpl
try
{
- new LoadPackageRequest(session.getChannel(), cdoPackage).send();
+ IFailOverStrategy failOverStrategy = session.getFailOverStrategy();
+ LoadPackageRequest request = new LoadPackageRequest(session.getChannel(), cdoPackage);
+ failOverStrategy.send(request);
+
if (!cdoPackage.isDynamic())
{
OM.LOG.info("Dynamic package created for " + cdoPackage.getPackageURI());
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java
index 0842877..839eef0 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java
@@ -10,6 +10,7 @@ import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.util.ServerException;
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
+import org.eclipse.net4j.signal.IFailOverStrategy;
import org.eclipse.net4j.util.fsm.FiniteStateMachine;
import org.eclipse.net4j.util.fsm.ITransition;
@@ -380,12 +381,14 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
private CDOID requestID(CDOResource resource, CDOViewImpl view)
{
- String path = CDOUtil.extractResourcePath(resource.getURI());
- ResourceIDRequest signal = new ResourceIDRequest(view.getSession().getChannel(), path);
-
try
{
- return signal.send();
+ String path = CDOUtil.extractResourcePath(resource.getURI());
+ CDOSessionImpl session = view.getSession();
+
+ IFailOverStrategy failOverStrategy = session.getFailOverStrategy();
+ ResourceIDRequest request = new ResourceIDRequest(session.getChannel(), path);
+ return failOverStrategy.send(request);
}
catch (RuntimeException ex)
{
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java
index f7ef9c8..8ae2441 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java
@@ -22,6 +22,7 @@ import org.eclipse.emf.cdo.protocol.util.TransportException;
import org.eclipse.net4j.IChannel;
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
+import org.eclipse.net4j.signal.IFailOverStrategy;
import org.eclipse.net4j.util.ImplementationError;
import org.eclipse.emf.internal.cdo.bundle.OM;
@@ -119,7 +120,9 @@ public class CDOTransactionImpl extends CDOViewImpl implements CDOTransaction
preCommit(dirtyObjects);
IChannel channel = session.getChannel();
- CommitTransactionResult result = new CommitTransactionRequest(channel, this).send(100000L);
+ IFailOverStrategy failOverStrategy = session.getFailOverStrategy();
+ CommitTransactionRequest request = new CommitTransactionRequest(channel, this);
+ CommitTransactionResult result = failOverStrategy.send(request, 100000L);
// TODO Change timeout semantics in Net4j
postCommit(newResources, result);
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOViewImpl.java
index b29586d..542cf91 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOViewImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOViewImpl.java
@@ -30,6 +30,7 @@ import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.util.ReadOnlyException;
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
+import org.eclipse.net4j.signal.IFailOverStrategy;
import org.eclipse.net4j.util.ImplementationError;
import org.eclipse.emf.common.notify.Adapter;
@@ -156,8 +157,9 @@ public class CDOViewImpl extends org.eclipse.net4j.internal.util.event.Notifier
try
{
- ResourcePathRequest signal = new ResourcePathRequest(getSession().getChannel(), resourceID);
- String path = signal.send();
+ IFailOverStrategy failOverStrategy = session.getFailOverStrategy();
+ ResourcePathRequest request = new ResourcePathRequest(session.getChannel(), resourceID);
+ String path = failOverStrategy.send(request);
CDOResourceImpl resource = (CDOResourceImpl)EresourceFactory.eINSTANCE.createCDOResource();
resource.setResourceSet(resourceSet);
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/FailOverStrategy.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/FailOverStrategy.java
new file mode 100644
index 0000000..cc1488a
--- /dev/null
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/FailOverStrategy.java
@@ -0,0 +1,93 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ **************************************************************************/
+package org.eclipse.net4j.signal;
+
+import org.eclipse.net4j.IChannel;
+import org.eclipse.net4j.IConnector;
+import org.eclipse.net4j.internal.util.event.Notifier;
+
+import java.util.concurrent.TimeoutException;
+
+/**
+ * @author Eike Stepper
+ */
+public class FailOverStrategy extends Notifier implements IFailOverStrategy
+{
+ public FailOverStrategy()
+ {
+ }
+
+ public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request) throws Exception
+ {
+ return send(request, SignalActor.NO_TIMEOUT);
+ }
+
+ public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request, long timeout) throws Exception
+ {
+ for (;;)
+ {
+ try
+ {
+ return request.send(timeout);
+ }
+ catch (TimeoutException exeption)
+ {
+ failOver(request.getProtocol());
+ }
+ }
+ }
+
+ protected void failOver(SignalProtocol protocol)
+ {
+ IChannel oldChannel = protocol.getChannel();
+ IConnector connector = getNewConnector(oldChannel);
+ IChannel newChannel = connector.openChannel(protocol);
+ protocol.setChannel(newChannel);
+ oldChannel.close();
+ fireEvent(new FailOverEvent(oldChannel, newChannel));
+ }
+
+ protected IConnector getNewConnector(IChannel oldChannel)
+ {
+ return oldChannel.getConnector();
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private final class FailOverEvent implements IFailOverEvent
+ {
+ private IChannel oldChannel;
+
+ private IChannel newChannel;
+
+ public FailOverEvent(IChannel oldChannel, IChannel newChannel)
+ {
+ this.oldChannel = oldChannel;
+ this.newChannel = newChannel;
+ }
+
+ public IFailOverStrategy getSource()
+ {
+ return FailOverStrategy.this;
+ }
+
+ public IChannel getOldChannel()
+ {
+ return oldChannel;
+ }
+
+ public IChannel getNewChannel()
+ {
+ return newChannel;
+ }
+ }
+}
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IFailOverEvent.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IFailOverEvent.java
new file mode 100644
index 0000000..f66aa93
--- /dev/null
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IFailOverEvent.java
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ **************************************************************************/
+package org.eclipse.net4j.signal;
+
+import org.eclipse.net4j.IChannel;
+import org.eclipse.net4j.util.event.IEvent;
+
+/**
+ * @author Eike Stepper
+ */
+public interface IFailOverEvent extends IEvent
+{
+ /**
+ * @return The old channel that was active before the fail over occured. At
+ * the time this event is being sent the old channel is already
+ * closed.
+ */
+ public IChannel getOldChannel();
+
+ /**
+ * @return The new channel that is active after the fail over occured. At the
+ * time this event is being sent the new channel is already active.
+ */
+ public IChannel getNewChannel();
+}
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IFailOverStrategy.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IFailOverStrategy.java
new file mode 100644
index 0000000..0e46fe4
--- /dev/null
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IFailOverStrategy.java
@@ -0,0 +1,25 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ **************************************************************************/
+package org.eclipse.net4j.signal;
+
+import org.eclipse.net4j.util.event.INotifier;
+
+/**
+ * @author Eike Stepper
+ */
+public interface IFailOverStrategy extends INotifier
+{
+ public static final IFailOverStrategy NOOP = NOOPFailOverStrategy.INSTANCE;
+
+ public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request) throws Exception;
+
+ public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request, long timeout) throws Exception;
+}
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/NOOPFailOverStrategy.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/NOOPFailOverStrategy.java
new file mode 100644
index 0000000..226868c
--- /dev/null
+++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/NOOPFailOverStrategy.java
@@ -0,0 +1,43 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ **************************************************************************/
+package org.eclipse.net4j.signal;
+
+import org.eclipse.net4j.util.event.IListener;
+
+/**
+ * @author Eike Stepper
+ */
+public class NOOPFailOverStrategy implements IFailOverStrategy
+{
+ public static final NOOPFailOverStrategy INSTANCE = new NOOPFailOverStrategy();
+
+ public NOOPFailOverStrategy()
+ {
+ }
+
+ public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request) throws Exception
+ {
+ return request.send();
+ }
+
+ public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request, long timeout) throws Exception
+ {
+ return request.send(timeout);
+ }
+
+ public void addListener(IListener listener)
+ {
+ }
+
+ public void removeListener(IListener listener)
+ {
+ }
+}