Рефакторинг двух планировщиков потоков для повышения производительности и хорошего дизайна [закрыто]JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Рефакторинг двух планировщиков потоков для повышения производительности и хорошего дизайна [закрыто]

Сообщение Anonymous »

В настоящее время существует 4 класса Service, ServiceHandler(Runnable), SessionManager и Session(Runnable). Все планирование ранее выполнялось с помощью продукта Tibco AST, который необходимо заменить. Нужна помощь в реализации приведенных ниже функций с помощью Spring Boot, ScheduledThreadPoolExecutor, который будет работать в течение всего срока службы приложения.

Код: Выделить всё

@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
}
}
Создание 1 планировщика с 1 потоком, который будет работать вечно и проверять ForWork каждые 5 минут, если в пути есть новые каталоги. Другой планировщик будет планировать 10 потоков для 10 разных каталогов, каждый из которых будет обрабатывать файлы в своем соответствующем каталоге. Пытаюсь избавиться и от Thread.sleep, поэтому использую планировщик и библиотеку Awaitility для сна потока там, где это необходимо (не использовал, так как не нашел в этом необходимости)
Это в основном рефакторинг кода, и дизайн своего рода плохо, поэтому хочу улучшить и понять, как вызывать метод checkForWork() в классе ServiceHandler без создания циклической зависимости весной.
Я подошел к этапу выше, как показано на рисунке фрагмент кода, но я не уверен, стоит ли мне сохранять класс ServiceHandler. Если я сделаю то, как мне это сделать, поскольку я не могу внедрить зависимость SessionManager, поскольку она станет циклической зависимостью. Если я удалю обработчик, то где будет вызывать checkForWork каждые 5 минут. Мой архитектор непреклонен в том, чтобы не использовать планировщик Spring для вызова этого, поэтому необходимо использовать ScheduledThreadPoolExecutor.

Подробнее здесь: https://stackoverflow.com/questions/785 ... ood-design
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Оптимизация и рефакторинг основного кода ASP .NET EF для повышения производительности WebAPI
    Anonymous » » в форуме C#
    0 Ответы
    60 Просмотры
    Последнее сообщение Anonymous
  • C# — Семантическое ядро ​​— правильное использование планировщиков
    Anonymous » » в форуме C#
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Как получить список планов планировщиков через Microsoft Graph, аналогичный моей веб -странице планов?
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Pimpl Idiom против мостового дизайна дизайна
    Anonymous » » в форуме C++
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Каковы методы реализации хорошего и правильного программного кода? [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»