boolean async )
throws ApplicationException, RemarshalException
{
checkORB();
RequestOutputStream ros = (RequestOutputStream)os;
ArrayDeque<Map<INVOCATION_KEY, UtcT>> invocationStack = invocationContext.get ();
/**
* We must just peek as we do not want to remove the context from
* the ArrayDeque
*/
Map<INVOCATION_KEY, UtcT> currentCtxt = invocationStack.peek();
UtcT reqET = null;
UtcT repET = null;
if (currentCtxt != null)
{
reqET = currentCtxt.get (INVOCATION_KEY.REQUEST_END_TIME);
repET = currentCtxt.get (INVOCATION_KEY.REPLY_END_TIME);
checkTimeout (reqET, repET);
}
ReplyReceiver receiver = null;
final ClientInterceptorHandler interceptors;
if (orb.hasClientRequestInterceptors())
{
interceptors = new DefaultClientInterceptorHandler
(
(DefaultClientInterceptorHandler)localInterceptors.get(),
orb,
ros,
self,
this,
piorOriginal,
connections[currentConnection.ordinal ()]
);
}
else
{
interceptors = NullClientInterceptorHandler.getInstance();
}
if ( connections[currentConnection.ordinal ()] != null )
{
orb.notifyTransportListeners (connections[currentConnection.ordinal ()].getGIOPConnection());
}
if (orb.hasRequestInterceptors())
{
localInterceptors.set(interceptors);
try
{
interceptors.handle_send_request();
}
catch (ForwardRequest fwd)
{
// Should not happen for remote requests
}
catch (RemarshalException re)
{
// RemarshalExceptions explicitely caught, because in
// that case, localInterceptors must stay set
throw re;
}
catch (RuntimeException e)
{
// If we are throwing a system exception then this will disrupt the call path.
// Therefore nullify localInterceptors so it doesn't appear we are still in an
// interceptor call.
localInterceptors.set(null);
throw e;
}
}
ClientConnection connectionToUse = null;
ReplyGroup group = null;
try
{
synchronized (bind_sync)
{
if ( ! bound )
{
// Somehow the connection got closed under us
throw new COMM_FAILURE("Connection closed");
}
else if (ros.getConnection() == connections[currentConnection.ordinal ()])
{
// RequestOutputStream has been created for
// exactly this connection
connectionToUse = connections[currentConnection.ordinal ()];
}
else
{
logger.debug("invoke: RemarshalException");
// RequestOutputStream has been created for
// another connection, so try again
throw new RemarshalException();
}
}
group = getReplyGroup (connectionToUse);
if ( !ros.response_expected() ) // oneway op
{
invoke_oneway (ros, connectionToUse, interceptors, group);
}
else
{
// response expected, synchronous or asynchronous
receiver = new ReplyReceiver(this, group,
ros.operation(),
ros.getReplyEndTime(),
interceptors, replyHandler, selectorManager);
try
{
receiver.configure(configuration);
}
catch (ConfigurationException ex)
{
logger.error ("Configuration problem with ReplyReceiver", ex);
throw new INTERNAL ("Caught configuration exception setting up ReplyReceiver.");
}
group.addHolder (receiver);
// Use the local copy of the client connection to avoid trouble
// with something else affecting the real connections[currentConnection].
connectionToUse.sendRequest(ros, receiver, ros.requestId(), true);
getParsedIOR ().markLastUsedProfile ();
}
}
catch ( org.omg.CORBA.SystemException cfe )
{