/* static */ void ConsumeWriteCallback::timerComplete(const ClientImplPtr& client, const PubSubDataPtr& data, const boost::system::error_code& error) { if (error) { // shutting down return; } client->getSubscriberImpl().consume(data->getTopic(), data->getSubscriberId(), data->getMessageSeqId()); }
ActiveSubscriber::ActiveSubscriber(const PubSubDataPtr& data, const AbstractDuplexChannelPtr& channel, const SubscriptionPreferencesPtr& preferences, const DuplexChannelManagerPtr& channelManager) : channel(channel), deliverystate(STOPPED_DELIVERY), origData(data), preferences(preferences), channelManager(channelManager), should_wait(false) { LOG4CXX_DEBUG(logger, "Creating ActiveSubscriber " << this << " for (topic:" << data->getTopic() << ", subscriber:" << data->getSubscriberId() << ")."); }
void ActiveSubscriber::consume(const MessageSeqId& messageSeqId) { PubSubDataPtr data = PubSubData::forConsumeRequest(channelManager->nextTxnId(), origData->getSubscriberId(), origData->getTopic(), messageSeqId); int retrywait = channelManager->getConfiguration() .getInt(Configuration::MESSAGE_CONSUME_RETRY_WAIT_TIME, DEFAULT_MESSAGE_CONSUME_RETRY_WAIT_TIME); OperationCallbackPtr writecb(new ConsumeWriteCallback(shared_from_this(), data, retrywait)); channel->writeRequest(data->getRequest(), writecb); }
void CloseSubscriptionResponseHandler::handleResponse( const PubSubResponsePtr& m, const PubSubDataPtr& txn, const DuplexChannelPtr& channel) { switch (m->statuscode()) { case SUCCESS: if (m->has_responsebody()) { txn->getCallback()->operationComplete(m->responsebody()); } else { txn->getCallback()->operationComplete(ResponseBody()); } break; case SERVICE_DOWN: LOG4CXX_ERROR(logger, "Server responsed with SERVICE_DOWN for " << txn->getTxnId()); txn->getCallback()->operationFailed(ServiceDownException()); break; case CLIENT_ALREADY_SUBSCRIBED: case TOPIC_BUSY: txn->getCallback()->operationFailed(AlreadySubscribedException()); break; case CLIENT_NOT_SUBSCRIBED: txn->getCallback()->operationFailed(NotSubscribedException()); break; case NOT_RESPONSIBLE_FOR_TOPIC: redirectRequest(m, txn, channel); break; default: LOG4CXX_ERROR(logger, "Unexpected response " << m->statuscode() << " for " << txn->getTxnId()); txn->getCallback()->operationFailed(UnexpectedResponseException()); break; } }
void SubscriberImpl::doSubscribe(const DuplexChannelPtr& channel, const PubSubDataPtr& data, const SubscriberClientChannelHandlerPtr& handler) { channel->storeTransaction(data); OperationCallbackPtr writecb(new SubscriberWriteCallback(client, data)); channel->writeRequest(data->getRequest(), writecb); boost::lock_guard<boost::shared_mutex> lock(topicsubscriber2handler_lock); TopicSubscriber t(data->getTopic(), data->getSubscriberId()); SubscriberClientChannelHandlerPtr oldhandler = topicsubscriber2handler[t]; if (oldhandler != NULL) { oldhandler->handoverDelivery(handler); } topicsubscriber2handler[t] = handler; LOG4CXX_DEBUG(logger, "Set topic subscriber for topic(" << data->getTopic() << ") subscriberId(" << data->getSubscriberId() << ") to " << handler.get() << " topicsubscriber2topic(" << &topicsubscriber2handler << ")"); }
void SubscriberImpl::consume(const std::string& topic, const std::string& subscriberId, const MessageSeqId& messageSeqId) { TopicSubscriber t(topic, subscriberId); boost::shared_lock<boost::shared_mutex> lock(topicsubscriber2handler_lock); SubscriberClientChannelHandlerPtr handler = topicsubscriber2handler[t]; if (handler.get() == 0) { LOG4CXX_ERROR(logger, "Cannot consume. Bad handler for topic(" << topic << ") subscriberId(" << subscriberId << ") topicsubscriber2topic(" << &topicsubscriber2handler << ")"); return; } DuplexChannelPtr channel = handler->getChannel(); if (channel.get() == 0) { LOG4CXX_ERROR(logger, "Trying to consume a message on a topic/subscriber pair that don't have a channel. Something fishy going on. Topic: " << topic << " SubscriberId: " << subscriberId << " MessageSeqId: " << messageSeqId.localcomponent()); } PubSubDataPtr data = PubSubData::forConsumeRequest(client->counter().next(), subscriberId, topic, messageSeqId); OperationCallbackPtr writecb(new ConsumeWriteCallback(client, data)); channel->writeRequest(data->getRequest(), writecb); }
/* static */ void ConsumeWriteCallback::timerComplete( const ActiveSubscriberPtr& activeSubscriber, const PubSubDataPtr& data, const boost::system::error_code& error) { if (error) { // shutting down return; } activeSubscriber->consume(data->getMessageSeqId()); }
/** takes ownership of txn */ void SubscriberImpl::messageHandler(const PubSubResponsePtr& m, const PubSubDataPtr& txn) { if (!txn.get()) { LOG4CXX_ERROR(logger, "Invalid transaction"); return; } LOG4CXX_DEBUG(logger, "message received with status " << m->statuscode()); switch (m->statuscode()) { case SUCCESS: txn->getCallback()->operationComplete(); break; case SERVICE_DOWN: txn->getCallback()->operationFailed(ServiceDownException()); break; case CLIENT_ALREADY_SUBSCRIBED: case TOPIC_BUSY: txn->getCallback()->operationFailed(AlreadySubscribedException()); break; case CLIENT_NOT_SUBSCRIBED: txn->getCallback()->operationFailed(NotSubscribedException()); break; default: txn->getCallback()->operationFailed(UnexpectedResponseException()); break; } }
void PublisherImpl::messageHandler(const PubSubResponsePtr& m, const PubSubDataPtr& txn) { switch (m->statuscode()) { case SUCCESS: if (m->has_responsebody()) { txn->getCallback()->operationComplete(m->responsebody()); } else { txn->getCallback()->operationComplete(ResponseBody()); } break; case SERVICE_DOWN: LOG4CXX_ERROR(logger, "Server responsed with SERVICE_DOWN for " << txn->getTxnId()); txn->getCallback()->operationFailed(ServiceDownException()); break; default: LOG4CXX_ERROR(logger, "Unexpected response " << m->statuscode() << " for " << txn->getTxnId()); txn->getCallback()->operationFailed(UnexpectedResponseException()); break; } }
void SubscriberImpl::doUnsubscribe(const DuplexChannelPtr& channel, const PubSubDataPtr& data) { channel->storeTransaction(data); OperationCallbackPtr writecb(new UnsubscribeWriteCallback(client, data)); channel->writeRequest(data->getRequest(), writecb); }