1:
@Override
2:
public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException {
3: SendMessageContext mqtraceContext;
4:
switch (request.getCode()) {
5:
case RequestCode.CONSUMER_SEND_MSG_BACK:
6:
return
this.consumerSendMsgBack(ctx, request);
7:
default:
8:
9: SendMessageRequestHeader requestHeader = parseRequestHeader(request);
10:
if (requestHeader ==
null) {
11:
return
null;
12: }
13:
14: mqtraceContext = buildMsgContext(ctx, requestHeader);
15:
16:
this.executeSendMessageHookBefore(ctx, request, mqtraceContext);
17:
18:
final RemotingCommand response =
this.sendMessage(ctx, request, mqtraceContext, requestHeader);
19:
20:
this.executeSendMessageHookAfter(response, mqtraceContext);
21:
return response;
22: }
23: }
24:
25:
private RemotingCommand sendMessage(final ChannelHandlerContext ctx, //
26: final RemotingCommand request, //
27: final SendMessageContext sendMessageContext, //
28: final SendMessageRequestHeader requestHeader) throws RemotingCommandException {
29:
30:
31:
final RemotingCommand response = RemotingCommand.createResponseCommand(SendMessageResponseHeader.class);
32:
final SendMessageResponseHeader responseHeader = (SendMessageResponseHeader) response.readCustomHeader();
33: response.setOpaque(request.getOpaque());
34: response.addExtField(MessageConst.PROPERTY_MSG_REGION,
this.brokerController.getBrokerConfig().getRegionId());
35: response.addExtField(MessageConst.PROPERTY_TRACE_SWITCH, String.valueOf(
this.brokerController.getBrokerConfig().isTraceOn()));
36:
37:
if (log.isDebugEnabled()) {
38: log.debug(
"receive SendMessage request command, {}", request);
39: }
40:
41:
42:
@SuppressWarnings(
"SpellCheckingInspection")
43:
final
long startTimstamp =
this.brokerController.getBrokerConfig().getStartAcceptSendRequestTimeStamp();
44:
if (
this.brokerController.getMessageStore().now() < startTimstamp) {
45: response.setCode(ResponseCode.SYSTEM_ERROR);
46: response.setRemark(String.format(
"broker unable to service, until %s", UtilAll.timeMillisToHumanString2(startTimstamp)));
47:
return response;
48: }
49:
50:
51: response.setCode(-
1);
52:
super.msgCheck(ctx, requestHeader, response);
53:
if (response.getCode() != -
1) {
54:
return response;
55: }
56:
57:
final
byte[] body = request.getBody();
58:
59:
60:
int queueIdInt = requestHeader.getQueueId();
61: TopicConfig topicConfig =
this.brokerController.getTopicConfigManager().selectTopicConfig(requestHeader.getTopic());
62:
if (queueIdInt <
0) {
63: queueIdInt = Math.abs(
this.random.nextInt() %
99999999) % topicConfig.getWriteQueueNums();
64: }
65:
66:
67:
int sysFlag = requestHeader.getSysFlag();
68:
if (TopicFilterType.MULTI_TAG == topicConfig.getTopicFilterType()) {
69: sysFlag |= MessageSysFlag.MULTI_TAGS_FLAG;
70: }
71:
72:
73: String newTopic = requestHeader.getTopic();
74:
if (
null != newTopic && newTopic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)) {
75:
76: String groupName = newTopic.substring(MixAll.RETRY_GROUP_TOPIC_PREFIX.length());
77: SubscriptionGroupConfig subscriptionGroupConfig =
78:
this.brokerController.getSubscriptionGroupManager().findSubscriptionGroupConfig(groupName);
79:
if (
null == subscriptionGroupConfig) {
80: response.setCode(ResponseCode.SUBSCRIPTION_GROUP_NOT_EXIST);
81: response.setRemark(
"subscription group not exist, " + groupName +
" " + FAQUrl.suggestTodo(FAQUrl.SUBSCRIPTION_GROUP_NOT_EXIST));
82:
return response;
83: }
84:
85:
int maxReconsumeTimes = subscriptionGroupConfig.getRetryMaxTimes();
86:
if (request.getVersion() >= MQVersion.Version.V3_4_9.ordinal()) {
87: maxReconsumeTimes = requestHeader.getMaxReconsumeTimes();
88: }
89:
int reconsumeTimes = requestHeader.getReconsumeTimes() ==
null ?
0 : requestHeader.getReconsumeTimes();
90:
if (reconsumeTimes >= maxReconsumeTimes) {
91: newTopic = MixAll.getDLQTopic(groupName);
92: queueIdInt = Math.abs(
this.random.nextInt() %
99999999) % DLQ_NUMS_PER_GROUP;
93: topicConfig =
this.brokerController.getTopicConfigManager().createTopicInSendMessageBackMethod(newTopic,
94: DLQ_NUMS_PER_GROUP,
95: PermName.PERM_WRITE,
0
96: );
97:
if (
null == topicConfig) {
98: response.setCode(ResponseCode.SYSTEM_ERROR);
99: response.setRemark(
"topic[" + newTopic +
"] not exist");
100:
return response;
101: }
102: }
103: }
104:
105:
106: MessageExtBrokerInner msgInner =
new MessageExtBrokerInner();
107: msgInner.setTopic(newTopic);
108: msgInner.setBody(body);
109: msgInner.setFlag(requestHeader.getFlag());
110: MessageAccessor.setProperties(msgInner, MessageDecoder.string2messageProperties(requestHeader.getProperties()));
111: msgInner.setPropertiesString(requestHeader.getProperties());
112: msgInner.setTagsCode(MessageExtBrokerInner.tagsString2tagsCode(topicConfig.getTopicFilterType(), msgInner.getTags()));
113: msgInner.setQueueId(queueIdInt);
114: msgInner.setSysFlag(sysFlag);
115: msgInner.setBornTimestamp(requestHeader.getBornTimestamp());
116: msgInner.setBornHost(ctx.channel().remoteAddress());
117: msgInner.setStoreHost(
this.getStoreHost());
118: msgInner.setReconsumeTimes(requestHeader.getReconsumeTimes() ==
null ?
0 : requestHeader.getReconsumeTimes());
119:
120:
121:
if (
this.brokerController.getBrokerConfig().isRejectTransactionMessage()) {
122: String traFlag = msgInner.getProperty(MessageConst.PROPERTY_TRANSACTION_PREPARED);
123:
if (traFlag !=
null) {
124: response.setCode(ResponseCode.NO_PERMISSION);
125: response.setRemark(
126:
"the broker[" +
this.brokerController.getBrokerConfig().getBrokerIP1() +
"] sending transaction message is forbidden");
127:
return response;
128: }
129: }
130:
131:
132: PutMessageResult putMessageResult =
this.brokerController.getMessageStore().putMessage(msgInner);
133:
if (putMessageResult !=
null) {
134:
boolean sendOK =
false;
135:
136:
switch (putMessageResult.getPutMessageStatus()) {
137:
138:
case PUT_OK:
139: sendOK =
true;
140: response.setCode(ResponseCode.SUCCESS);
141:
break;
142:
case FLUSH_DISK_TIMEOUT:
143: response.setCode(ResponseCode.FLUSH_DISK_TIMEOUT);
144: sendOK =
true;
145:
break;
146:
case FLUSH_SLAVE_TIMEOUT:
147: response.setCode(ResponseCode.FLUSH_SLAVE_TIMEOUT);
148: sendOK =
true;
149:
break;
150:
case SLAVE_NOT_AVAILABLE:
151: response.setCode(ResponseCode.SLAVE_NOT_AVAILABLE);
152: sendOK =
true;
153:
break;
154:
155:
156:
case CREATE_MAPEDFILE_FAILED:
157: response.setCode(ResponseCode.SYSTEM_ERROR);
158: response.setRemark(
"create mapped file failed, server is busy or broken.");
159:
break;
160:
case MESSAGE_ILLEGAL:
161:
case PROPERTIES_SIZE_EXCEEDED:
162: response.setCode(ResponseCode.MESSAGE_ILLEGAL);
163: response.setRemark(
164:
"the message is illegal, maybe msg body or properties length not matched. msg body length limit 128k, msg properties length limit 32k.");
165:
break;
166:
case SERVICE_NOT_AVAILABLE:
167: response.setCode(ResponseCode.SERVICE_NOT_AVAILABLE);
168: response.setRemark(
169:
"service not available now, maybe disk full, " + diskUtil() +
", maybe your broker machine memory too small.");
170:
break;
171:
case OS_PAGECACHE_BUSY:
172: response.setCode(ResponseCode.SYSTEM_ERROR);
173: response.setRemark(
"[PC_SYNCHRONIZED]broker busy, start flow control for a while");
174:
break;
175:
case UNKNOWN_ERROR:
176: response.setCode(ResponseCode.SYSTEM_ERROR);
177: response.setRemark(
"UNKNOWN_ERROR");
178:
break;
179:
default:
180: response.setCode(ResponseCode.SYSTEM_ERROR);
181: response.setRemark(
"UNKNOWN_ERROR DEFAULT");
182:
break;
183: }
184:
185: String owner = request.getExtFields().get(BrokerStatsManager.COMMERCIAL_OWNER);
186:
if (sendOK) {
187:
188:
this.brokerController.getBrokerStatsManager().incTopicPutNums(msgInner.getTopic());
189:
this.brokerController.getBrokerStatsManager().incTopicPutSize(msgInner.getTopic(), putMessageResult.getAppendMessageResult().getWroteBytes());
190:
this.brokerController.getBrokerStatsManager().incBrokerPutNums();
191:
192:
193: response.setRemark(
null);
194: responseHeader.setMsgId(putMessageResult.getAppendMessageResult().getMsgId());
195: responseHeader.setQueueId(queueIdInt);
196: responseHeader.setQueueOffset(putMessageResult.getAppendMessageResult().getLogicsOffset());
197: doResponse(ctx, request, response);
198:
199:
200:
if (hasSendMessageHook()) {
201: sendMessageContext.setMsgId(responseHeader.getMsgId());
202: sendMessageContext.setQueueId(responseHeader.getQueueId());
203: sendMessageContext.setQueueOffset(responseHeader.getQueueOffset());
204:
205:
int commercialBaseCount = brokerController.getBrokerConfig().getCommercialBaseCount();
206:
int wroteSize = putMessageResult.getAppendMessageResult().getWroteBytes();
207:
int incValue = (
int) Math.ceil(wroteSize / BrokerStatsManager.SIZE_PER_COUNT) * commercialBaseCount;
208:
209: sendMessageContext.setCommercialSendStats(BrokerStatsManager.StatsType.SEND_SUCCESS);
210: sendMessageContext.setCommercialSendTimes(incValue);
211: sendMessageContext.setCommercialSendSize(wroteSize);
212: sendMessageContext.setCommercialOwner(owner);
213: }
214:
return
null;
215: }
else {
216:
217:
if (hasSendMessageHook()) {
218:
int wroteSize = request.getBody().length;
219:
int incValue = (
int) Math.ceil(wroteSize / BrokerStatsManager.SIZE_PER_COUNT);
220:
221: sendMessageContext.setCommercialSendStats(BrokerStatsManager.StatsType.SEND_FAILURE);
222: sendMessageContext.setCommercialSendTimes(incValue);
223: sendMessageContext.setCommercialSendSize(wroteSize);
224: sendMessageContext.setCommercialOwner(owner);
225: }
226: }
227: }
else {
228: response.setCode(ResponseCode.SYSTEM_ERROR);
229: response.setRemark(
"store putMessage return null");
230: }
231:
232:
return response;
233: }