package com.mossle.user.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.user.AccountLogDTO;
import com.mossle.user.service.AccountLogService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class AccountLogConsumer implements Runnable {
private static Logger logger = LoggerFactory
.getLogger(AccountLogConsumer.class);
public static final int DEFAULT_BATCH_SIZE = 64;
private AccountLogQueue accountLogQueue;
private AccountLogService accountLogService;
private int batchSize = DEFAULT_BATCH_SIZE;
private boolean active = true;
private Thread thread;
@PostConstruct
public void init() {
thread = new Thread(this);
thread.setDaemon(true);
thread.start();
}
@PreDestroy
public void close() {
active = false;
}
public void run() {
while (active) {
execute();
}
}
public void execute() {
List<AccountLogDTO> accountLogDtos = new ArrayList<AccountLogDTO>();
try {
int size = 0;
while (size < batchSize) {
AccountLogDTO accountLogDto = accountLogQueue.poll();
if (accountLogDto == null) {
break;
}
accountLogDtos.add(accountLogDto);
size++;
}
} catch (Exception ex) {
logger.info(ex.getMessage(), ex);
}
if (!accountLogDtos.isEmpty()) {
try {
accountLogService.batchLog(accountLogDtos);
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
}
}
@Resource
public void setAccountLogQueue(AccountLogQueue accountLogQueue) {
this.accountLogQueue = accountLogQueue;
}
@Resource
public void setAccountLogService(AccountLogService accountLogService) {
this.accountLogService = accountLogService;
}
public void setBatchSize(int batchSize) {
this.batchSize = batchSize;
}
}