LocalClientInvoker.java |
/*************************************** * * * JBoss: The OpenSource J2EE WebOS * * * * Distributable under LGPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.remoting.transport.local; import org.jboss.remoting.AbstractInvoker; import org.jboss.remoting.ConnectionFailedException; import org.jboss.remoting.InvocationRequest; import org.jboss.remoting.InvokerLocator; import org.jboss.remoting.InvokerRegistry; import org.jboss.remoting.ServerInvoker; import org.jboss.remoting.marshal.Marshaller; import org.jboss.remoting.marshal.UnMarshaller; import org.jboss.remoting.transport.ClientInvoker; /** * LocalClientInvoker does not use any transport protocol for invoking * the ServerInvoker, instead will make call directly on it locally. * This increases performance since no serialization required as well * as needed for push callbacks where InvokerCallbackHandler is in * same JVM as the callback server. * * @author <a href="mailto:telrod@vocalocity.net">Tom Elrod</a> * @version $Revision: 1.3.8.2 $ */ public class LocalClientInvoker extends AbstractInvoker implements ClientInvoker { private ServerInvoker serverInvoker; public LocalClientInvoker(InvokerLocator locator) { super(locator); } /** * transport a request against a remote ServerInvoker * * @param invocation * @return * @throws Throwable */ public Object invoke(InvocationRequest invocation) throws Throwable { if (log.isDebugEnabled()) { log.debug("Using local client invoker for invocation."); } Object ret = null; if (serverInvoker != null) { ret = serverInvoker.invoke(invocation); } else { throw new ConnectionFailedException("Error invoking on server because " + "no local server to call upon."); } return ret; } /** * subclasses must provide this method to return true if their remote connection is connected and * false if disconnected. in some transports, such as SOAP, this method may always return true, since the * remote connectivity is done on demand and not kept persistent like other transports (such as socket-based * transport). * * @return boolean true if connected, false if not */ public boolean isConnected() { return serverInvoker != null; } /** * connect to the remote invoker * * @throws ConnectionFailedException */ public void connect() throws ConnectionFailedException { // nothing to be done here. Should already have reference to serverInvoker } /** * disconnect from the remote invoker. Once disconnect called * will not be able to re-connect by calling connect since will * loose reference to server invoker. */ public void disconnect() { /** * Need to remove myself from registry so will not keep * reference to me since I am of no use now (since serverInvoker * reference is null). Will have to create a new one. */ InvokerRegistry.destroyClientInvoker(getLocator()); serverInvoker = null; } public void setMarshaller(Marshaller marshaller) { // No op since is local, do not need marshaller } public Marshaller getMarshaller() { return null; } public void setUnMarshaller(UnMarshaller unmarshaller) { // No op since is local, do not need unmarshaller } public UnMarshaller getUnMarshaller() { return null; } /** * This will set the local reference to the server invoker. * This is needed to so can make calls directly against server. * * @param svrInvoker */ public void setServerInvoker(ServerInvoker svrInvoker) { this.serverInvoker = svrInvoker; } }
LocalClientInvoker.java |