/**
* Copyright (c) 2005-2009 springside.org.cn
*
* Licensed under the Apache License, Version 2.0 (the "License");
*
* $Id$
*/
package org.springside.examples.showcase.queue;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.util.Assert;
/**
* 采用定时批量读取Queue中消息策略的Consumer.
*/
public abstract class PeriodConsumer extends QueueConsumer {
protected int batchSize = 0;
protected int period = 0;
/**
* 批量定时读取消息的队列大小.
*/
public void setBatchSize(int batchSize) {
this.batchSize = batchSize;
}
/**
* 批量定时读取的时间间隔,单位为毫秒.
*/
public void setPeriod(int period) {
this.period = period;
}
@PostConstruct
public void checkSetting() {
Assert.isTrue(batchSize > 0);
Assert.isTrue(period > 0);
}
/**
* 线程执行函数,定期批量获取消息并调用processMessageList()处理.
*/
@SuppressWarnings("unchecked")
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
List list = new ArrayList(batchSize);
queue.drainTo(list, batchSize);
processMessageList(list);
if (!Thread.currentThread().isInterrupted()) {
Thread.sleep(period);
}
}
} catch (InterruptedException e) {
// Ignore.
} finally {
//退出线程前调用清理函数.
clean();
}
}
/**
* 批量消息处理函数.
*/
protected abstract void processMessageList(List<?> messageList);
/**
* 退出清理函数.
*/
protected abstract void clean();
}