blob: fb2d2a64bd055ac4f9249b8010470910891dd39c [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.
*/
#include "CommandCustomHeader.h"
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sstream>
#include <string>
#include <cstdlib>
#include "RemotingCommand.h"
#include "MQProtos.h"
#include "KPRUtil.h"
#include "UtilAll.h"
#include "json/json.h"
namespace rmq
{
CommandCustomHeader* CommandCustomHeader::decode(int code, Json::Value& data, bool isResponseType)
{
CommandCustomHeader* pCustomHeader = NULL;
try
{
if (isResponseType)
{
switch (code)
{
case SEND_MESSAGE_VALUE:
case SEND_MESSAGE_V2_VALUE:
pCustomHeader = SendMessageResponseHeader::decode(data);
break;
case PULL_MESSAGE_VALUE:
pCustomHeader = PullMessageResponseHeader::decode(data);
break;
case QUERY_CONSUMER_OFFSET_VALUE:
pCustomHeader = QueryConsumerOffsetResponseHeader::decode(data);
break;
case SEARCH_OFFSET_BY_TIMESTAMP_VALUE:
pCustomHeader = SearchOffsetResponseHeader::decode(data);
break;
case GET_MAX_OFFSET_VALUE:
pCustomHeader = GetMaxOffsetResponseHeader::decode(data);
break;
case GET_MIN_OFFSET_VALUE:
pCustomHeader = GetMinOffsetResponseHeader::decode(data);
break;
case GET_EARLIEST_MSG_STORETIME_VALUE:
pCustomHeader = GetEarliestMsgStoretimeResponseHeader::decode(data);
break;
case QUERY_MESSAGE_VALUE:
pCustomHeader = QueryMessageResponseHeader::decode(data);
break;
case GET_KV_CONFIG_VALUE:
pCustomHeader = GetKVConfigResponseHeader::decode(data);
break;
default:
break;
}
}
else
{
switch (code)
{
case NOTIFY_CONSUMER_IDS_CHANGED_VALUE:
pCustomHeader = NotifyConsumerIdsChangedRequestHeader::decode(data);
break;
case GET_CONSUMER_RUNNING_INFO_VALUE:
pCustomHeader = GetConsumerRunningInfoRequestHeader::decode(data);
break;
default:
break;
}
}
}
catch(std::exception& e)
{
if (pCustomHeader != NULL)
{
delete pCustomHeader;
pCustomHeader = NULL;
}
RMQ_ERROR("CommandCustomHeader decode exception, %d, %d, %s, %s",
code, isResponseType, UtilAll::toString(data).c_str(), e.what());
}
catch(...)
{
if (pCustomHeader != NULL)
{
delete pCustomHeader;
pCustomHeader = NULL;
}
RMQ_ERROR("CommandCustomHeader decode exception, %d, %d, %s",
code, isResponseType, UtilAll::toString(data).c_str());
}
return pCustomHeader;
}
////////////////////////////////////////////////////////////////////////////////
//GET_ROUTEINTO_BY_TOPIC_VALUE
////////////////////////////////////////////////////////////////////////////////
void GetRouteInfoRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"topic\":\"" << topic << "\""
<< "}";
outData = ss.str();
}
////////////////////////////////////////////////////////////////////////////////
// UPDATE_AND_CREATE_TOPIC_VALUE
////////////////////////////////////////////////////////////////////////////////
void CreateTopicRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"topic\":\"" << topic << "\","
<< "\"defaultTopic\":\"" << defaultTopic << "\","
<< "\"readQueueNums\":\"" << readQueueNums << "\","
<< "\"writeQueueNums\":\"" << writeQueueNums << "\","
<< "\"perm\":\"" << perm << "\","
<< "\"topicFilterType\":\"" << topicFilterType << "\","
<< "\"topicSysFlag\":\"" << topicFilterType << "\","
<< "\"order\":\"" << topicFilterType << "\""
<< "}";
outData = ss.str();
}
////////////////////////////////////////////////////////////////////////////////
// SEND_MESSAGE_VALUE/SEND_MESSAGE_V2_VALUE
////////////////////////////////////////////////////////////////////////////////
void SendMessageRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"producerGroup\":\"" << producerGroup << "\","
<< "\"topic\":\"" << topic << "\","
<< "\"defaultTopic\":\"" << defaultTopic << "\","
<< "\"defaultTopicQueueNums\":" << defaultTopicQueueNums << ","
<< "\"queueId\":" << queueId << ","
<< "\"sysFlag\":" << sysFlag << ","
<< "\"bornTimestamp\":" << bornTimestamp << ","
<< "\"flag\":" << flag << ","
<< "\"properties\":\"" << properties << "\","
<< "\"reconsumeTimes\":" << reconsumeTimes
<< "}";
outData = ss.str();
}
void SendMessageRequestHeaderV2::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"a\":\"" << a << "\","
<< "\"b\":\"" << b << "\","
<< "\"c\":\"" << c << "\","
<< "\"d\":\"" << d << "\","
<< "\"e\":\"" << e << "\","
<< "\"f\":\"" << f << "\","
<< "\"g\":\"" << g << "\","
<< "\"h\":\"" << h << "\","
<< "\"i\":\"" << i << "\","
<< "\"j\":\"" << j << "\""
<< "}";
outData = ss.str();
}
SendMessageRequestHeader* SendMessageRequestHeaderV2::createSendMessageRequestHeaderV1(
const SendMessageRequestHeaderV2* v2)
{
SendMessageRequestHeader* v1 = new SendMessageRequestHeader();
v1->producerGroup = v2->a;
v1->topic = v2->b;
v1->defaultTopic = v2->c;
v1->defaultTopicQueueNums = v2->d;
v1->queueId = v2->e;
v1->sysFlag = v2->f;
v1->bornTimestamp = v2->g;
v1->flag = v2->h;
v1->properties = v2->i;
v1->reconsumeTimes = v2->j;
return v1;
}
SendMessageRequestHeaderV2* SendMessageRequestHeaderV2::createSendMessageRequestHeaderV2(
const SendMessageRequestHeader* v1)
{
SendMessageRequestHeaderV2* v2 = new SendMessageRequestHeaderV2();
v2->a = v1->producerGroup;
v2->b = v1->topic;
v2->c = v1->defaultTopic;
v2->d = v1->defaultTopicQueueNums;
v2->e = v1->queueId;
v2->f = v1->sysFlag;
v2->g = v1->bornTimestamp;
v2->h = v1->flag;
v2->i = v1->properties;
v2->j = v1->reconsumeTimes;
return v2;
}
void SendMessageResponseHeader::encode(std::string& outData)
{
}
CommandCustomHeader* SendMessageResponseHeader::decode(Json::Value& data)
{
std::string msgId = data["msgId"].asString();
int queueId = atoi(data["queueId"].asCString());
long long queueOffset = KPRUtil::str2ll(data["queueOffset"].asCString());
SendMessageResponseHeader* h = new SendMessageResponseHeader();
h->msgId = msgId;
h->queueId = queueId;
h->queueOffset = queueOffset;
return h;
}
////////////////////////////////////////////////////////////////////////////////
// PULL_MESSAGE_VALUE
////////////////////////////////////////////////////////////////////////////////
void PullMessageRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"consumerGroup\":\"" << consumerGroup << "\","
<< "\"topic\":\"" << topic << "\","
<< "\"queueId\":\"" << queueId << "\","
<< "\"queueOffset\":\"" << queueOffset << "\","
<< "\"maxMsgNums\":\"" << maxMsgNums << "\","
<< "\"sysFlag\":\"" << sysFlag << "\","
<< "\"commitOffset\":\"" << commitOffset << "\","
<< "\"suspendTimeoutMillis\":\"" << suspendTimeoutMillis << "\","
<< "\"subscription\":\"" << subscription << "\","
<< "\"subVersion\":\"" << subVersion << "\""
<< "}";
outData = ss.str();
}
void PullMessageResponseHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"suggestWhichBrokerId\":\"" << suggestWhichBrokerId << "\","
<< "\"nextBeginOffset\":\"" << nextBeginOffset << "\","
<< "\"minOffset\":\"" << minOffset << "\","
<< "\"maxOffset\":\"" << maxOffset << "\""
<< "}";
outData = ss.str();
}
CommandCustomHeader* PullMessageResponseHeader::decode(Json::Value& data)
{
long long suggestWhichBrokerId = KPRUtil::str2ll(data["suggestWhichBrokerId"].asCString());
long long nextBeginOffset = KPRUtil::str2ll(data["nextBeginOffset"].asCString());
long long minOffset = KPRUtil::str2ll(data["minOffset"].asCString());
long long maxOffset = KPRUtil::str2ll(data["maxOffset"].asCString());
PullMessageResponseHeader* h = new PullMessageResponseHeader();
h->suggestWhichBrokerId = suggestWhichBrokerId;
h->nextBeginOffset = nextBeginOffset;
h->minOffset = minOffset;
h->maxOffset = maxOffset;
return h;
}
////////////////////////////////////////////////////////////////////////////////
// GET_CONSUMER_LIST_BY_GROUP_VALUE
////////////////////////////////////////////////////////////////////////////////
void GetConsumerListByGroupRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"consumerGroup\":\"" << consumerGroup << "\""
<< "}";
outData = ss.str();
}
////////////////////////////////////////////////////////////////////////////////
// CONSUMER_SEND_MSG_BACK_VALUE
////////////////////////////////////////////////////////////////////////////////
void ConsumerSendMsgBackRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"offset\":\"" << offset << "\","
<< "\"group\":\"" << group << "\","
<< "\"delayLevel\":\"" << delayLevel << "\""
<< "}";
outData = ss.str();
}
////////////////////////////////////////////////////////////////////////////////
// QUERY_CONSUMER_OFFSET_VALUE
////////////////////////////////////////////////////////////////////////////////
void QueryConsumerOffsetRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"consumerGroup\":\"" << consumerGroup << "\","
<< "\"topic\":\"" << topic << "\","
<< "\"queueId\":\"" << queueId << "\""
<< "}";
outData = ss.str();
}
void QueryConsumerOffsetResponseHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"offset\":\"" << offset << "\""
<< "}";
outData = ss.str();
}
CommandCustomHeader* QueryConsumerOffsetResponseHeader::decode(Json::Value& data)
{
long long offset = -1;
if (data.isMember("offset"))
{
offset = KPRUtil::str2ll(data["offset"].asCString());
}
QueryConsumerOffsetResponseHeader* h = new QueryConsumerOffsetResponseHeader();
h->offset = offset;
return h;
}
////////////////////////////////////////////////////////////////////////////////
// UPDATE_CONSUMER_OFFSET_VALUE
////////////////////////////////////////////////////////////////////////////////
void UpdateConsumerOffsetRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"consumerGroup\":\"" << consumerGroup << "\","
<< "\"topic\":\"" << topic << "\","
<< "\"queueId\":\"" << queueId << "\","
<< "\"commitOffset\":\"" << commitOffset << "\""
<< "}";
outData = ss.str();
}
////////////////////////////////////////////////////////////////////////////////
// UNREGISTER_CLIENT_VALUE
////////////////////////////////////////////////////////////////////////////////
void UnregisterClientRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"producerGroup\":\"" << producerGroup << "\","
<< "\"consumerGroup\":\"" << consumerGroup << "\","
<< "\"clientID\":\"" << clientID << "\""
<< "}";
outData = ss.str();
}
///////////////////////////////////////////////////////////////////////
// VIEW_MESSAGE_BY_ID_VALUE
///////////////////////////////////////////////////////////////////////
void ViewMessageRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"offset\":" << offset
<< "}";
outData = ss.str();
}
///////////////////////////////////////////////////////////////////////
// SEARCH_OFFSET_BY_TIMESTAMP_VALUE
///////////////////////////////////////////////////////////////////////
void SearchOffsetRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"topic\":\"" << topic << "\","
<< "\"queueId\":\"" << queueId << "\","
<< "\"timestamp\":\"" << timestamp << "\""
<< "}";
outData = ss.str();
}
void SearchOffsetResponseHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"offset\":\"" << offset << "\""
<< "}";
outData = ss.str();
}
CommandCustomHeader* SearchOffsetResponseHeader::decode(Json::Value& data)
{
long long offset = KPRUtil::str2ll(data["offset"].asCString());
SearchOffsetResponseHeader* h = new SearchOffsetResponseHeader();
h->offset = offset;
return h;
}
///////////////////////////////////////////////////////////////////////
// GET_MAX_OFFSET_VALUE
///////////////////////////////////////////////////////////////////////
void GetMaxOffsetRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"topic\":\"" << topic << "\","
<< "\"queueId\":\"" << queueId << "\""
<< "}";
outData = ss.str();
}
void GetMaxOffsetResponseHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"offset\":\"" << offset << "\""
<< "}";
outData = ss.str();
}
CommandCustomHeader* GetMaxOffsetResponseHeader::decode(Json::Value& data)
{
long long offset = KPRUtil::str2ll(data["offset"].asCString());
GetMaxOffsetResponseHeader* h = new GetMaxOffsetResponseHeader();
h->offset = offset;
return h;
}
///////////////////////////////////////////////////////////////////////
// GET_MIN_OFFSET_VALUE
///////////////////////////////////////////////////////////////////////
void GetMinOffsetRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"topic\":\"" << topic << "\","
<< "\"queueId\":\"" << queueId << "\""
<< "}";
outData = ss.str();
}
void GetMinOffsetResponseHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"offset\":\"" << offset << "\""
<< "}";
outData = ss.str();
}
CommandCustomHeader* GetMinOffsetResponseHeader::decode(Json::Value& data)
{
long long offset = KPRUtil::str2ll(data["offset"].asCString());
GetMinOffsetResponseHeader* h = new GetMinOffsetResponseHeader();
h->offset = offset;
return h;
}
///////////////////////////////////////////////////////////////////////
// GET_EARLIEST_MSG_STORETIME_VALUE
///////////////////////////////////////////////////////////////////////
void GetEarliestMsgStoretimeRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"topic\":\"" << topic << "\","
<< "\"queueId\":\"" << queueId << "\""
<< "}";
outData = ss.str();
}
void GetEarliestMsgStoretimeResponseHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"timestamp\":\"" << timestamp << "\""
<< "}";
outData = ss.str();
}
CommandCustomHeader* GetEarliestMsgStoretimeResponseHeader::decode(Json::Value& data)
{
long long timestamp = KPRUtil::str2ll(data["timestamp"].asCString());
GetEarliestMsgStoretimeResponseHeader* h = new GetEarliestMsgStoretimeResponseHeader();
h->timestamp = timestamp;
return h;
}
///////////////////////////////////////////////////////////////////////
// QUERY_MESSAGE_VALUE
///////////////////////////////////////////////////////////////////////
void QueryMessageRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"topic\":\"" << topic << "\","
<< "\"key\":\"" << key << "\","
<< "\"maxNum\":\"" << maxNum << "\","
<< "\"beginTimestamp\":\"" << beginTimestamp << "\","
<< "\"endTimestamp\":\"" << endTimestamp << "\""
<< "}";
outData = ss.str();
}
void QueryMessageResponseHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"indexLastUpdateTimestamp\":\"" << indexLastUpdateTimestamp << "\","
<< "\"indexLastUpdatePhyoffset\":\"" << indexLastUpdatePhyoffset << "\""
<< "}";
outData = ss.str();
}
CommandCustomHeader* QueryMessageResponseHeader::decode(Json::Value& data)
{
long long indexLastUpdateTimestamp = KPRUtil::str2ll(data["indexLastUpdateTimestamp"].asCString());
long long indexLastUpdatePhyoffset = KPRUtil::str2ll(data["indexLastUpdatePhyoffset"].asCString());
QueryMessageResponseHeader* h = new QueryMessageResponseHeader();
h->indexLastUpdateTimestamp = indexLastUpdateTimestamp;
h->indexLastUpdatePhyoffset = indexLastUpdatePhyoffset;
return h;
}
///////////////////////////////////////////////////////////////////////
// GET_KV_CONFIG_VALUE
///////////////////////////////////////////////////////////////////////
void GetKVConfigRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"namespace\":\"" << namespace_ << "\","
<< "\"key\":\"" << key << "\""
<< "}";
outData = ss.str();
}
void GetKVConfigResponseHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"value\":\"" << value << "\""
<< "}";
outData = ss.str();
}
CommandCustomHeader* GetKVConfigResponseHeader::decode(Json::Value& data)
{
GetKVConfigResponseHeader* h = new GetKVConfigResponseHeader();
h->value = data["value"].asString();
return h;
}
///////////////////////////////////////////////////////////////////////
// NOTIFY_CONSUMER_IDS_CHANGED_VALUE
///////////////////////////////////////////////////////////////////////
void NotifyConsumerIdsChangedRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"consumerGroup\":\"" << consumerGroup << "\""
<< "}";
outData = ss.str();
}
CommandCustomHeader* NotifyConsumerIdsChangedRequestHeader::decode(Json::Value& data)
{
NotifyConsumerIdsChangedRequestHeader* h = new NotifyConsumerIdsChangedRequestHeader();
h->consumerGroup = data["consumerGroup"].asString();
return h;
}
///////////////////////////////////////////////////////////////////////
// GET_CONSUMER_RUNNING_INFO_VALUE
///////////////////////////////////////////////////////////////////////
void GetConsumerRunningInfoRequestHeader::encode(std::string& outData)
{
std::stringstream ss;
ss << "{"
<< "\"consumerGroup\":\"" << consumerGroup << "\","
<< "\"clientId\":\"" << clientId << "\","
<< "\"jstackEnable\":\"" << jstackEnable << "\","
<< "}";
outData = ss.str();
}
CommandCustomHeader* GetConsumerRunningInfoRequestHeader::decode(Json::Value& data)
{
GetConsumerRunningInfoRequestHeader* h = new GetConsumerRunningInfoRequestHeader();
h->consumerGroup = data["consumerGroup"].asString();
h->clientId = data["clientId"].asString();
h->jstackEnable = false;//not support
return h;
}
}