package com.easyooo.framework.support.transaction;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 缓冲事务资源,所有加入的只有在事务完成才会提交
*
* @author Killer
*/
public class SimpleBufferedTransactionResource<T> implements TransactionResource {
Logger logger = LoggerFactory.getLogger(getClass());
private final Collection<T> buffer = new ArrayList<T>();
private AtomicInteger requested = new AtomicInteger();
private RemoteSender<T> sender;
private String provider = "UNKNOWN";
public SimpleBufferedTransactionResource(RemoteSender<T> directSender){
this.sender = directSender;
this.provider = directSender.getProviderInfo();
}
@Override
public void begin() throws Throwable {
// do nothing
}
@Override
public void commit() throws Throwable {
if(buffer.size() > 0){
if(sender instanceof RemoteSenderMorly){
if (logger.isDebugEnabled()) {
logger.debug("Morly["+ sender.getProviderInfo() +"] sender ready");
}
RemoteSenderMorly<T> rsm = ((RemoteSenderMorly<T>) sender);
rsm.send(buffer);
}else if(sender instanceof RemoteSenderOrderly){
if (logger.isDebugEnabled()) {
logger.debug("Orderly["+ sender.getProviderInfo() +"] sender ready");
}
RemoteSenderOrderly<T> rso = ((RemoteSenderOrderly<T>) sender);
Iterator<T> iterator = buffer.iterator();
for (;iterator.hasNext();) {
T data = iterator.next();
rso.send(data);
}
}
if (logger.isInfoEnabled()) {
logger.info(String
.format("[%s] buffer has been flushed to the server, total %d items",
provider, requested.get()));
}
}else{
logger.warn("No need to send message buffers");
}
}
@Override
public void rollback() throws Throwable {
if(logger.isDebugEnabled()){
logger.info("Transaction Resource has been rolled back.");
}
buffer.clear();
}
public void send(T data){
if(data == null){
return ;
}
buffer.add(data);
requested.incrementAndGet();
if(logger.isDebugEnabled()){
logger.debug(String.format("[%s] buffer has joined %d messages",
provider, requested.get()));
}
}
/**
* @return 返回一个副本
*/
public Collection<T> getBufferList(){
return new CopyOnWriteArrayList<T>(buffer);
}
/**
* 通常情况下返回的集合只读,但也可以自行修改,但请慎重修改
* 通常应该调用@see {@link #getBufferList()}
* @return 返回原始的缓冲数组
*/
protected Collection<T> getOriginalBufferList(){
return buffer;
}
}