private void HandleResponseMessage(IClientMessage response)
{
var correlationId = response.GetCorrelationId();
ClientInvocation invocation;
if (_invocations.TryRemove(correlationId, out invocation))
{
if (response.GetMessageType() == Error.Type)
{
var error = Error.Decode(response);
if (Logger.IsFinestEnabled())
{
Logger.Finest("Error received from server: " + error);
}
var exception = ExceptionUtil.ToException(error);
// retry only specific exceptions
HandleInvocationException(invocation, exception);
}
// if this was a re-registration operation, then we will throw away the response and just store the alias
else if ((invocation is ClientListenerInvocation) &&
(invocation.Future.IsComplete && invocation.Future.Result != null))
{
var listenerInvocation = (ClientListenerInvocation) invocation;
var originalRegistrationId = GetRegistrationIdFromResponse(listenerInvocation);
var newRegistrationId = listenerInvocation.ResponseDecoder(response);
_client.GetListenerService()
.ReregisterListener(originalRegistrationId, newRegistrationId,
invocation.Message.GetCorrelationId());
if (Logger.IsFinestEnabled())
{
Logger.Finest(string.Format("Re-registered listener for {0} of type {1:X}",
originalRegistrationId,
listenerInvocation.Message.GetMessageType()));
}
}
else
{
invocation.Future.Result = response;
}
}
else
{
Logger.Warning("No call for correlationId: " + correlationId + ", response: " + response);
}
}