package com.firefly.core;
import com.firefly.utils.concurrent.Promise;
import com.firefly.utils.function.Func0;
import com.firefly.utils.lang.AbstractLifeCycle;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author Pengtao Qiu
*/
public class ApplicationContextSingleton extends AbstractLifeCycle {
private static ApplicationContextSingleton ourInstance = new ApplicationContextSingleton();
public static ApplicationContextSingleton getInstance() {
return ourInstance;
}
private ExecutorService executorService;
private ApplicationContextSingleton() {
}
private ApplicationContext applicationContext;
public ApplicationContext getApplicationContext() {
start();
return applicationContext;
}
public <T> Promise.Completable<T> async(Func0<T> func) {
Promise.Completable<T> c = new Promise.Completable<>();
executorService.submit(() -> {
try {
c.succeeded(func.call());
} catch (Throwable t) {
c.failed(t);
}
});
return c;
}
public void async(Runnable runnable) {
executorService.submit(runnable);
}
@Override
protected void init() {
applicationContext = new XmlApplicationContext();
executorService = new ThreadPoolExecutor(16, 256,
30L, TimeUnit.SECONDS,
new LinkedTransferQueue<>(),
r -> new Thread(r, "firefly run blocking task pool"));
}
@Override
protected void destroy() {
applicationContext = null;
if (executorService != null) {
executorService.shutdown();
}
}
}