@Override
public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request)
throws RemotingCommandException {
final RemotingCommand response = RemotingCommand.createResponseCommand(null);
final EndTransactionRequestHeader requestHeader =
(EndTransactionRequestHeader) request
.decodeCommandCustomHeader(EndTransactionRequestHeader.class);
// 回查应答
if (requestHeader.getFromTransactionCheck()) {
switch (requestHeader.getCommitOrRollback()) {
// 不提交也不回滚
case MessageSysFlag.TransactionNotType: {
logTransaction.warn("check producer[{}] transaction state, but it's pending status.\n"//
+ "RequestHeader: {} Remark: {}",//
RemotingHelper.parseChannelRemoteAddr(ctx.channel()), //
requestHeader.toString(),//
request.getRemark());
return null;
}
// 提交
case MessageSysFlag.TransactionCommitType: {
logTransaction.warn(
"check producer[{}] transaction state, the producer commit the message.\n"//
+ "RequestHeader: {} Remark: {}",//
RemotingHelper.parseChannelRemoteAddr(ctx.channel()), //
requestHeader.toString(),//
request.getRemark());
break;
}
// 回滚
case MessageSysFlag.TransactionRollbackType: {
logTransaction.warn(
"check producer[{}] transaction state, the producer rollback the message.\n"//
+ "RequestHeader: {} Remark: {}",//
RemotingHelper.parseChannelRemoteAddr(ctx.channel()), //
requestHeader.toString(),//
request.getRemark());
break;
}
default:
return null;
}
}
// 正常提交回滚
else {
switch (requestHeader.getCommitOrRollback()) {
// 不提交也不回滚
case MessageSysFlag.TransactionNotType: {
logTransaction.warn(
"the producer[{}] end transaction in sending message, and it's pending status.\n"//
+ "RequestHeader: {} Remark: {}",//
RemotingHelper.parseChannelRemoteAddr(ctx.channel()), //
requestHeader.toString(),//
request.getRemark());
return null;
}
// 提交
case MessageSysFlag.TransactionCommitType: {
break;
}
// 回滚
case MessageSysFlag.TransactionRollbackType: {
logTransaction.warn(
"the producer[{}] end transaction in sending message, rollback the message.\n"//
+ "RequestHeader: {} Remark: {}",//
RemotingHelper.parseChannelRemoteAddr(ctx.channel()), //
requestHeader.toString(),//
request.getRemark());
break;
}
default:
return null;
}
}
final MessageExt msgExt =
this.brokerController.getMessageStore().lookMessageByOffset(
requestHeader.getCommitLogOffset());
if (msgExt != null) {
// 校验Producer Group
final String pgroupRead = msgExt.getProperty(MessageConst.PROPERTY_PRODUCER_GROUP);
if (!pgroupRead.equals(requestHeader.getProducerGroup())) {
response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
response.setRemark("the producer group wrong");
return response;
}
// 校验Transaction State Table Offset
if (msgExt.getQueueOffset() != requestHeader.getTranStateTableOffset()) {
response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
response.setRemark("the transaction state table offset wrong");
return response;
}
// 校验Commit Log Offset
if (msgExt.getCommitLogOffset() != requestHeader.getCommitLogOffset()) {
response.setCode(ResponseCode.SYSTEM_ERROR_VALUE);
response.setRemark("the commit log offset wrong");
return response;
}
MessageExtBrokerInner msgInner = this.endMessageTransaction(msgExt);
msgInner.setSysFlag(MessageSysFlag.resetTransactionValue(msgInner.getSysFlag(),
requestHeader.getCommitOrRollback()));
msgInner.setQueueOffset(requestHeader.getTranStateTableOffset());
msgInner.setPreparedTransactionOffset(requestHeader.getCommitLogOffset());
msgInner.setStoreTimestamp(msgExt.getStoreTimestamp());
if (MessageSysFlag.TransactionRollbackType == requestHeader.getCommitOrRollback()) {
msgInner.setBody(null);
}
final MessageStore messageStore = this.brokerController.getMessageStore();
final PutMessageResult putMessageResult = messageStore.putMessage(msgInner);