package com.alibaba.rocketmq.storm.domain;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import com.alibaba.rocketmq.common.message.MessageExt;
import com.alibaba.rocketmq.common.message.MessageQueue;
/**
* @author Von Gosling
*/
public class BatchMessage {
private final static long WAIT_TIMEOUT = 5;
private UUID batchId;
private transient List<MessageExt> msgList;
private MessageQueue mq;
private CountDownLatch latch;
private boolean isSuccess;
private long nextOffset;
private long offset;
private MessageStat messageStat = new MessageStat();
public BatchMessage() {
}
public BatchMessage(List<MessageExt> msgList, MessageQueue mq) {
this.msgList = msgList;
this.mq = mq;
this.batchId = UUID.randomUUID();
this.latch = new CountDownLatch(1);
this.isSuccess = false;
offset = getMinOffset(msgList);
nextOffset = getMaxOffset(msgList) + 1;
}
private long getMinOffset(List<MessageExt> msgs) {
long minOffset = Long.MAX_VALUE;
for (MessageExt msg : msgs) {
if (msg.getQueueOffset() < minOffset) {
minOffset = msg.getQueueOffset();
}
}
return minOffset;
}
private long getMaxOffset(List<MessageExt> msgs) {
long maxOffset = Long.MIN_VALUE;
for (MessageExt msg : msgs) {
if (msg.getQueueOffset() > maxOffset) {
maxOffset = msg.getQueueOffset();
}
}
return maxOffset;
}
public UUID getBatchId() {
return batchId;
}
public List<MessageExt> getMsgList() {
return msgList;
}
public boolean waitFinish() throws InterruptedException {
return latch.await(WAIT_TIMEOUT, TimeUnit.MINUTES);
}
public void done() {
isSuccess = true;
latch.countDown();
}
public void fail() {
isSuccess = false;
latch.countDown();
}
public boolean isSuccess() {
return isSuccess;
}
public String getMessageQueue() {
if (mq == null) {
return null;
}
return mq.toString();
}
public long getOffset() {
return offset;
}
public void setOffset(long offset) {
this.offset = offset;
}
public long getNextOffset() {
return nextOffset;
}
public void setNextOffset(long nextOffset) {
this.nextOffset = nextOffset;
}
public MessageStat getMessageStat() {
return messageStat;
}
public void setMessageStat(MessageStat messageStat) {
this.messageStat = messageStat;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}