if (!(e.getMessage() instanceof PubSubResponse)) {
ctx.sendUpstream(e);
}
// Retrieve the PubSubResponse from the Message that was sent by the
// server.
PubSubResponse response = (PubSubResponse) e.getMessage();
if (logger.isDebugEnabled())
logger.debug("Response received from host: " + HedwigClientImpl.getHostFromChannel(ctx.getChannel())
+ ", response: " + response);
// Determine if this PubSubResponse is an ack response for a PubSub
// Request or if it is a message being pushed to the client subscriber.
if (response.hasMessage()) {
// Subscribed messages being pushed to the client so handle/consume
// it and return.
subHandler.handleSubscribeMessage(response);
return;
}
// Response is an ack to a prior PubSubRequest so first retrieve the
// PubSub data for this txn.
PubSubData pubSubData = txn2PubSubData.containsKey(response.getTxnId()) ? txn2PubSubData.get(response
.getTxnId()) : null;
// Validate that the PubSub data for this txn is stored. If not, just
// log an error message and return since we don't know how to handle
// this.
if (pubSubData == null) {
logger.error("PubSub Data was not found for PubSubResponse: " + response);
return;
}
// Now that we've retrieved the PubSubData for this specific Txn ID, we
// can remove it from the Map.
txn2PubSubData.remove(response.getTxnId());
// Store the topic2Host mapping if this wasn't a server redirect. We'll
// assume that if the server was able to have an open Channel connection
// to the client, and responded with an ack message other than the
// NOT_RESPONSIBLE_FOR_TOPIC one, it is the correct topic master.
if (!response.getStatusCode().equals(StatusCode.NOT_RESPONSIBLE_FOR_TOPIC)) {
client.storeTopic2HostMapping(pubSubData, ctx.getChannel());
}
// Depending on the operation type, call the appropriate handler.
switch (pubSubData.operationType) {
case PUBLISH:
pubHandler.handlePublishResponse(response, pubSubData, ctx.getChannel());
break;
case SUBSCRIBE:
subHandler.handleSubscribeResponse(response, pubSubData, ctx.getChannel());
break;
case UNSUBSCRIBE:
unsubHandler.handleUnsubscribeResponse(response, pubSubData, ctx.getChannel());
break;
default:
// The above are the only expected PubSubResponse messages received
// from the server for the various client side requests made.
logger.error("Response received from server is for an unhandled operation type, txnId: "
+ response.getTxnId() + ", operationType: " + pubSubData.operationType);
}
}