예제 #1
0
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);
}
예제 #2
0
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 << ")");
}
예제 #3
0
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);
}
예제 #4
0
void SubscriberImpl::doUnsubscribe(const DuplexChannelPtr& channel, const PubSubDataPtr& data) {
  channel->storeTransaction(data);
  OperationCallbackPtr writecb(new UnsubscribeWriteCallback(client, data));
  channel->writeRequest(data->getRequest(), writecb);
}