/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ #include "CPushConsumer.h" #include #include "CCommon.h" #include "CMessageExt.h" #include "DefaultMQPushConsumer.h" #include "MQClientErrorContainer.h" using namespace rocketmq; using namespace std; class MessageListenerInner : public MessageListenerConcurrently { public: MessageListenerInner() {} MessageListenerInner(CPushConsumer* consumer, MessageCallBack pCallback) { m_pconsumer = consumer; m_pMsgReceiveCallback = pCallback; } ~MessageListenerInner() {} ConsumeStatus consumeMessage(const std::vector& msgs) { // to do user call back if (m_pMsgReceiveCallback == NULL) { return RECONSUME_LATER; } for (size_t i = 0; i < msgs.size(); ++i) { MQMessageExt* msg = const_cast(&msgs[i]); CMessageExt* message = (CMessageExt*)(msg); if (m_pMsgReceiveCallback(m_pconsumer, message) != E_CONSUME_SUCCESS) return RECONSUME_LATER; } return CONSUME_SUCCESS; } private: MessageCallBack m_pMsgReceiveCallback; CPushConsumer* m_pconsumer; }; class MessageListenerOrderlyInner : public MessageListenerOrderly { public: MessageListenerOrderlyInner(CPushConsumer* consumer, MessageCallBack pCallback) { m_pconsumer = consumer; m_pMsgReceiveCallback = pCallback; } ConsumeStatus consumeMessage(const std::vector& msgs) { if (m_pMsgReceiveCallback == NULL) { return RECONSUME_LATER; } for (size_t i = 0; i < msgs.size(); ++i) { MQMessageExt* msg = const_cast(&msgs[i]); CMessageExt* message = (CMessageExt*)(msg); if (m_pMsgReceiveCallback(m_pconsumer, message) != E_CONSUME_SUCCESS) return RECONSUME_LATER; } return CONSUME_SUCCESS; } private: MessageCallBack m_pMsgReceiveCallback; CPushConsumer* m_pconsumer; }; map g_ListenerMap; map g_OrderListenerMap; #ifdef __cplusplus extern "C" { #endif char VERSION_FOR_PUSH_CONSUMER[MAX_SDK_VERSION_LENGTH]; CPushConsumer* CreatePushConsumer(const char* groupId) { if (groupId == NULL) { return NULL; } DefaultMQPushConsumer* defaultMQPushConsumer = new DefaultMQPushConsumer(groupId); defaultMQPushConsumer->setConsumeFromWhere(CONSUME_FROM_LAST_OFFSET); strncpy(VERSION_FOR_PUSH_CONSUMER, defaultMQPushConsumer->version().c_str(), MAX_SDK_VERSION_LENGTH - 1); VERSION_FOR_PUSH_CONSUMER[MAX_SDK_VERSION_LENGTH - 1] = 0; return (CPushConsumer*)defaultMQPushConsumer; } int DestroyPushConsumer(CPushConsumer* consumer) { if (consumer == NULL) { return NULL_POINTER; } delete reinterpret_cast(consumer); return OK; } int StartPushConsumer(CPushConsumer* consumer) { if (consumer == NULL) { return NULL_POINTER; } try { ((DefaultMQPushConsumer*)consumer)->start(); } catch (exception& e) { MQClientErrorContainer::setErr(string(e.what())); return PUSHCONSUMER_START_FAILED; } return OK; } int ShutdownPushConsumer(CPushConsumer* consumer) { if (consumer == NULL) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->shutdown(); return OK; } const char* ShowPushConsumerVersion(CPushConsumer* consumer) { if (consumer == NULL) { return NULL; } return VERSION_FOR_PUSH_CONSUMER; } int SetPushConsumerGroupID(CPushConsumer* consumer, const char* groupId) { if (consumer == NULL || groupId == NULL) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->setGroupName(groupId); return OK; } const char* GetPushConsumerGroupID(CPushConsumer* consumer) { if (consumer == NULL) { return NULL; } return ((DefaultMQPushConsumer*)consumer)->getGroupName().c_str(); } int SetPushConsumerNameServerAddress(CPushConsumer* consumer, const char* namesrv) { if (consumer == NULL) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->setNamesrvAddr(namesrv); return OK; } int SetPushConsumerNameServerDomain(CPushConsumer* consumer, const char* domain) { if (consumer == NULL) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->setNamesrvDomain(domain); return OK; } int Subscribe(CPushConsumer* consumer, const char* topic, const char* expression) { if (consumer == NULL) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->subscribe(topic, expression); return OK; } int RegisterMessageCallback(CPushConsumer* consumer, MessageCallBack pCallback) { if (consumer == NULL || pCallback == NULL) { return NULL_POINTER; } MessageListenerInner* listenerInner = new MessageListenerInner(consumer, pCallback); ((DefaultMQPushConsumer*)consumer)->registerMessageListener(listenerInner); g_ListenerMap[consumer] = listenerInner; return OK; } int RegisterMessageCallbackOrderly(CPushConsumer* consumer, MessageCallBack pCallback) { if (consumer == NULL || pCallback == NULL) { return NULL_POINTER; } MessageListenerOrderlyInner* messageListenerOrderlyInner = new MessageListenerOrderlyInner(consumer, pCallback); ((DefaultMQPushConsumer*)consumer)->registerMessageListener(messageListenerOrderlyInner); g_OrderListenerMap[consumer] = messageListenerOrderlyInner; return OK; } int UnregisterMessageCallbackOrderly(CPushConsumer* consumer) { if (consumer == NULL) { return NULL_POINTER; } map::iterator iter; iter = g_OrderListenerMap.find(consumer); if (iter != g_OrderListenerMap.end()) { MessageListenerOrderlyInner* listenerInner = iter->second; if (listenerInner != NULL) { delete listenerInner; } g_OrderListenerMap.erase(iter); } return OK; } int UnregisterMessageCallback(CPushConsumer* consumer) { if (consumer == NULL) { return NULL_POINTER; } map::iterator iter; iter = g_ListenerMap.find(consumer); if (iter != g_ListenerMap.end()) { MessageListenerInner* listenerInner = iter->second; if (listenerInner != NULL) { delete listenerInner; } g_ListenerMap.erase(iter); } return OK; } int SetPushConsumerMessageModel(CPushConsumer* consumer, CMessageModel messageModel) { if (consumer == NULL) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->setMessageModel(MessageModel((int)messageModel)); return OK; } int SetPushConsumerThreadCount(CPushConsumer* consumer, int threadCount) { if (consumer == NULL || threadCount == 0) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->setConsumeThreadCount(threadCount); return OK; } int SetPushConsumerMessageBatchMaxSize(CPushConsumer* consumer, int batchSize) { if (consumer == NULL || batchSize == 0) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->setConsumeMessageBatchMaxSize(batchSize); return OK; } int SetPushConsumerMaxCacheMessageSize(CPushConsumer* consumer, int maxCacheSize) { if (consumer == NULL || maxCacheSize <= 0) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->setMaxCacheMsgSizePerQueue(maxCacheSize); return OK; } int SetPushConsumerMaxCacheMessageSizeInMb(CPushConsumer* consumer, int maxCacheSizeInMb) { if (consumer == NULL || maxCacheSizeInMb <= 0) { return NULL_POINTER; } return Not_Support; } int SetPushConsumerInstanceName(CPushConsumer* consumer, const char* instanceName) { if (consumer == NULL) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->setInstanceName(instanceName); return OK; } int SetPushConsumerSessionCredentials(CPushConsumer* consumer, const char* accessKey, const char* secretKey, const char* channel) { if (consumer == NULL) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->setSessionCredentials(accessKey, secretKey, channel); return OK; } int SetPushConsumerLogPath(CPushConsumer* consumer, const char* logPath) { if (consumer == NULL) { return NULL_POINTER; } // Todo, This api should be implemented by core api. //((DefaultMQPushConsumer *) consumer)->setInstanceName(instanceName); return OK; } int SetPushConsumerLogFileNumAndSize(CPushConsumer* consumer, int fileNum, long fileSize) { if (consumer == NULL) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->setLogFileSizeAndNum(fileNum, fileSize); return OK; } int SetPushConsumerLogLevel(CPushConsumer* consumer, CLogLevel level) { if (consumer == NULL) { return NULL_POINTER; } ((DefaultMQPushConsumer*)consumer)->setLogLevel((elogLevel)level); return OK; } int SetPushConsumerMessageTrace(CPushConsumer* consumer, CTraceModel openTrace) { if (consumer == NULL) { return NULL_POINTER; } bool messageTrace = openTrace == OPEN ? true : false; ((DefaultMQPushConsumer*)consumer)->setMessageTrace(messageTrace); return OK; } #ifdef __cplusplus }; #endif