Код: Выделить всё
@Service
class Service implements ApplicationListener {
private SessionManager sessionManager;
public Service(SessionManager sessionManager) {
this.sessionManager = sessionManager;
}
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
sessionManager.start();
}
@PreDestroy
public void stop() {
sessionManager.stop();
}
}
@Component
class ServiceHandler implements Runnable {
@Override
public void run() {
//existing tibco class used to create a call sessionManager's checkForWork() so it was being initialized in the constructor as well. Can't do that here as if I inject SessionManager here then there'll be circular dependency.
}
}
@Component
class SessionManager {
private ServiceHandler handler;
private ScheduledThreadPoolExecutor checkForWorkScheduler;
private ScheduledThreadPoolExecutor sessionScheduler;
public SessionManager(ServiceHandler handler) {
this.handler = handler;
checkForWorkScheduler = new ScheduledThreadPoolExecutor(1);
sessionScheduler = new ScheduledThreadPoolExecutor(10);
}
public void checkForWork() {
File[] entries = path.listFiles();
if(entries != null) {
for(File entry : entries) {
if(entry.isDirectory()) {
Session session = new Session(this, entry);
sessionScheduler.scheduleAtFixedRate(session, 0, 10, TimeUnit.SECONDS);
}
}
}
public void start() {
String path = "/MAIN/DIRECTORY/PATH";
File file = new File(path);
checkForWorkScheduler.scheduleAtFixedRate(serviceHandler, 5, 300, TimeUnit.SECONDS);
}
public void stop() {
sessionScheduler.shutdown();
try {
if(!sessionScheduler.awaitTermination(/*CalculateKeepAliveTime*/ , TimeUnit.SECONDS) {
sessionScheduler.shutdownNow();
}
} catch(InterruptedException e) {
log.error(e);
}
checkForWorkScheduler.shutdown();
}
}
class Session implements Runnable {
@Override
public void run() {
//complex logic to process each file in the directory
}
}
Это в основном рефакторинг кода, и дизайн своего рода плохо, поэтому хочу улучшить и понять, как вызывать метод checkForWork() в классе ServiceHandler без создания циклической зависимости весной.
Я подошел к этапу выше, как показано на рисунке фрагмент кода, но я не уверен, стоит ли мне сохранять класс ServiceHandler. Если я сделаю то, как мне это сделать, поскольку я не могу внедрить зависимость SessionManager, поскольку она станет циклической зависимостью. Если я удалю обработчик, то где будет вызывать checkForWork каждые 5 минут. Мой архитектор непреклонен в том, чтобы не использовать планировщик Spring для вызова этого, поэтому необходимо использовать ScheduledThreadPoolExecutor.
Подробнее здесь: https://stackoverflow.com/questions/785 ... ood-design