package com.mossle.audit.component;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import com.mossle.api.audit.AuditDTO;
import com.mossle.audit.service.AuditService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class AuditConsumer implements Runnable {
private static Logger logger = LoggerFactory.getLogger(AuditConsumer.class);
public static final int DEFAULT_BATCH_SIZE = 64;
private AuditQueue auditQueue;
private AuditService auditService;
private int batchSize = DEFAULT_BATCH_SIZE;
private boolean active = true;
private Thread thread;
@PostConstruct
public void init() {
thread = new Thread(this);
thread.start();
}
@PreDestroy
public void close() {
active = false;
}
public void run() {
while (active) {
execute();
}
}
public void execute() {
List<AuditDTO> auditDtos = new ArrayList<AuditDTO>();
try {
int size = 0;
while (size < batchSize) {
AuditDTO auditDto = auditQueue.poll();
if (auditDto == null) {
break;
}
auditDtos.add(auditDto);
size++;
}
} catch (Exception ex) {
logger.info(ex.getMessage(), ex);
}
if (!auditDtos.isEmpty()) {
auditService.batchLog(auditDtos);
}
}
@Resource
public void setAuditQueue(AuditQueue auditQueue) {
this.auditQueue = auditQueue;
}
@Resource
public void setAuditService(AuditService auditService) {
this.auditService = auditService;
}
public void setBatchSize(int batchSize) {
this.batchSize = batchSize;
}
}