У меня есть приложение Java, которое должно выполняться как процесс Linux. Он подключается к удаленной системе через соединение сокета. У меня есть два потока, которые проходят весь жизненный цикл программы. Это краткая версия моей точки входа в приложение:Шаблон проектирования ExecutorService
public class SMPTerminal {
private static java.util.concurrent.ExcecutorService executor;
public static void main(String[] args) {
executor = Executors.newFixedThreadPool(2);
Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownHook()));
run(new SMPConsumer());
run(new SMPMaintainer());
}
public static void run(Service callableService) {
try {
Future<Callable> future = executor.submit(callableService);
run(future.get().restart());
} catch (InterruptedException | ExcecutionException e) {
// Program will shutdown
}
}
}
Это Service
интерфейс:
public interface Service() {
public Service restart();
}
И это одна реализация Service
интерфейса:
public class SMPConsumer implements Callable<Service>, Service {
@Override
public Service call() throws Exception {
// ...
try {
while(true) {
// Perform the service
}
} catch (InterruptedException | IOException e) {
// ...
}
return this; // Returns this instance to run again
}
public Service restart() {
// Perform the initialization
return this;
}
}
я достиг этой структуры после того, как у меня возникают головные боли, когда временный сбой IO или другие проблемы вызывают остановку моего приложения. Теперь, если моя программа сталкивается с проблемой, она не завершается полностью, а просто инициализирует себя с нуля и продолжается. Но я думаю, что это немного натянуто, и я нарушаю правила проектирования ООП. Мои вопросы
- Является ли эта ошибка обработки правильной или эффективной?
- Какие проблемы я могу столкнуться в будущем?
- Должен ли я изучать какой-либо специальный шаблон дизайна для моей проблемы?
Возможно, вам понадобится использовать «BlockingQueue», который будет действовать как балансировщик нагрузки, вы можете просто перегрузить ваш «ExcecutorService» до такой степени, что он не сможет выполнить все запросы. – PeterK
@PeterK служба «ExecutorService» работает только с потоками, и я запускаю каждый поток (реализация интерфейса «Service»), если поток прерывается из-за исключения IO и т. Д., Которое невозможно обработать из потока. Также я использую очередь сообщений внутри 'SMPConsumer'. –