import com.google.common.eventbus.AsyncEventBus;
import com.google.common.eventbus.EventBus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Configuration
@Slf4j
public class EventBusConfig {
@Bean
public EventBus eventPublisherEventBus(ExecutorService es){
return new AsyncEventBus(es, new CustomSubscriberExceptionHandler());
}
@Bean
public ExecutorService executorService(SystemConfig systemConfig) {
SystemConfig.ThreadPool threadPool = systemConfig.getThreadPool();
CustomizableThreadFactory threadFactory = new CustomizableThreadFactory(threadPool.getThreadNamePrefix);
return new ThreadPoolExecutor(threadPool.getCorePoolSize(),
threadPool.getMaxPoolSize(), threadPool.getKeepAliveSeconds(), TimeUnit.SECONDS,
new LinkedBlockingQueue<>(threadPool.getQueueCapacity()), threadFactory,
new ThreadPoolExecutor.CallerRunsPolicy()) {
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
printException(r, t);
}
};
}
private static void printException(Runnable r, Throwable t) {
if (t == null && r instanceof Future>) {
try {
Future> future = (Future>) r;
if (future.isDone())
future.get();
} catch (CancellationException ce) {
t = ce;
} catch (ExecutionException ee) {
t = ee.getCause();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
if (t != null)
log.error("publish occur error: ", t);
}
}