blob: 171565cdc994fb7c0d5dbd1906c860c89f402428 [file]
/**
* Copyright (C) 2013 kangliqiang ,kangliq@163.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __DEFAULTMQPULLCONSUMERIMPL_H__
#define __DEFAULTMQPULLCONSUMERIMPL_H__
#include <string>
#include <set>
#include <map>
#include <vector>
#include "MQConsumerInner.h"
#include "MessageExt.h"
#include "QueryResult.h"
#include "ServiceState.h"
#include "PullRequest.h"
#include "MessageQueue.h"
#include "PullResult.h"
#include "PullCallback.h"
#include "PullAPIWrapper.h"
namespace rmq
{
class DefaultMQPullConsumer;
class PullCallback;
class OffsetStore;
class RebalanceImpl;
class MQClientFactory;
class PullAPIWrapper;
/**
* PullConsumer imp
*/
class DefaultMQPullConsumerImpl : public MQConsumerInner
{
public:
DefaultMQPullConsumerImpl(DefaultMQPullConsumer *pDefaultMQPullConsumer);
~DefaultMQPullConsumerImpl();
void createTopic(const std::string &key, const std::string &newTopic,
int queueNum);
long long fetchConsumeOffset(MessageQueue &mq, bool fromStore);
std::set<MessageQueue> *fetchMessageQueuesInBalance(const std::string &topic);
std::vector<MessageQueue> *fetchPublishMessageQueues(const std::string &topic);
std::set<MessageQueue> *fetchSubscribeMessageQueues(const std::string &topic);
long long earliestMsgStoreTime(const MessageQueue &mq);
std::string groupName();
MessageModel messageModel();
ConsumeType consumeType();
ConsumeFromWhere consumeFromWhere();
std::set<SubscriptionData> subscriptions();
void doRebalance();
void persistConsumerOffset();
void updateTopicSubscribeInfo(const std::string &topic,
const std::set<MessageQueue> &info);
bool isSubscribeTopicNeedUpdate(const std::string &topic);
long long maxOffset(const MessageQueue &mq);
long long minOffset(const MessageQueue &mq);
PullResult *pull(MessageQueue &mq,
const std::string &subExpression,
long long offset,
int maxNums);
void pull(MessageQueue &mq,
const std::string &subExpression,
long long offset,
int maxNums,
PullCallback *pPullCallback);
PullResult *pullBlockIfNotFound(MessageQueue &mq,
const std::string &subExpression,
long long offset, int maxNums);
void pullBlockIfNotFound(MessageQueue &mq,
const std::string &subExpression,
long long offset, int maxNums,
PullCallback *pPullCallback);
QueryResult queryMessage(const std::string &topic,
const std::string &key,
int maxNum,
long long begin,
long long end);
long long searchOffset(const MessageQueue &mq, long long timestamp);
void sendMessageBack(MessageExt &msg, int delayLevel,
const std::string &brokerName);
void sendMessageBack(MessageExt &msg, int delayLevel,
const std::string &brokerName, const std::string &consumerGroup);
void shutdown();
void updateConsumeOffset(MessageQueue &mq, long long offset);
MessageExt *viewMessage(const std::string &msgId);
DefaultMQPullConsumer *getDefaultMQPullConsumer();
OffsetStore *getOffsetStore();
void setOffsetStore(OffsetStore *pOffsetStore);
void start();
ServiceState getServiceState();
void setServiceState(ServiceState serviceState);
private:
void makeSureStateOK();
void subscriptionAutomatically(const std::string &topic);
void copySubscription();
void checkConfig();
PullResult *pullSyncImpl(MessageQueue &mq,
const std::string &subExpression,
long long offset,
int maxNums,
bool block) ;
void pullAsyncImpl(MessageQueue &mq,
const std::string &subExpression,
long long offset,
int maxNums,
PullCallback *pPullCallback,
bool block);
private:
DefaultMQPullConsumer *m_pDefaultMQPullConsumer;
ServiceState m_serviceState;
MQClientFactory *m_pMQClientFactory;
PullAPIWrapper *m_pPullAPIWrapper;
OffsetStore *m_pOffsetStore;
RebalanceImpl *m_pRebalanceImpl;
friend class DefaultMQPullConsumerImplCallback;
};
class DefaultMQPullConsumerImplCallback : public PullCallback
{
public:
DefaultMQPullConsumerImplCallback(SubscriptionData &subscriptionData,
MessageQueue &mq,
DefaultMQPullConsumerImpl *pDefaultMQPullConsumerImpl,
PullCallback *pCallback)
: m_subscriptionData(subscriptionData),
m_mq(mq),
m_pDefaultMQPullConsumerImpl(pDefaultMQPullConsumerImpl),
m_pCallback(pCallback)
{
}
void onSuccess(PullResult &pullResult)
{
m_pCallback->onSuccess(
*m_pDefaultMQPullConsumerImpl->m_pPullAPIWrapper->
processPullResult(m_mq, pullResult, m_subscriptionData));
}
void onException(MQException &e)
{
m_pCallback->onException(e);
}
private:
SubscriptionData m_subscriptionData;
MessageQueue m_mq;
DefaultMQPullConsumerImpl *m_pDefaultMQPullConsumerImpl;
PullCallback *m_pCallback;
};
}
#endif