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 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); }
void SubscriberImpl::doUnsubscribe(const DuplexChannelPtr& channel, const PubSubDataPtr& data) { channel->storeTransaction(data); OperationCallbackPtr writecb(new UnsubscribeWriteCallback(client, data)); channel->writeRequest(data->getRequest(), writecb); }