throws ClientNotSubscribedException, AlreadyStartDeliveryException {
// Make sure we know about this topic subscription on the client side
// exists. The assumption is that the client should have in memory the
// Channel created for the TopicSubscriber once the server has sent
// an ack response to the initial subscribe request.
SubscribeResponseHandler subscribeResponseHandler =
getSubscribeResponseHandler(topicSubscriber);
if (null == subscribeResponseHandler ||
!subscribeResponseHandler.hasSubscription(topicSubscriber)) {
logger.error("Client is not yet subscribed to {}.", topicSubscriber);
throw new ClientNotSubscribedException("Client is not yet subscribed to "
+ topicSubscriber);
}
MessageHandler existedMsgHandler = topicSubscriber2MessageHandler.get(topicSubscriber);
if (restart) {
// restart using existing msg handler
messageHandler = existedMsgHandler;
} else {
// some has started delivery but not stop it
if (null != existedMsgHandler) {
throw new AlreadyStartDeliveryException("A message handler has been started for topic subscriber " + topicSubscriber);
}
if (messageHandler != null) {
if (null != topicSubscriber2MessageHandler.putIfAbsent(topicSubscriber, messageHandler)) {
throw new AlreadyStartDeliveryException("Someone is also starting delivery for topic subscriber " + topicSubscriber);
}
}
}
// tell subscribe response handler to start delivering messages for topicSubscriber
subscribeResponseHandler.startDelivery(topicSubscriber, messageHandler);
}