Мы работаем над проектом для управления менеджерами виртуальных машин из приложения Java.
В настоящий момент мы столкнулись с проблемой, когда некоторые инструкции следует рассматривать как задачу, поскольку они требуют больше времени. Тезисы также могут заканчиваться ошибками или быть успешными, и мы не сможем узнать результат из приложения, если не запросим состояние задачи у гипервизора ВМ.
Чтобы иметь гладкое приложение, мы хотели иметь CommandManager для обработки разностного запроса к этим гипервизорам в отдельных потоках. Проблема заключается в том, что эти Command могут возвращать определенные ошибки, такие как те, что мы использовали для перехвата в представлении, чтобы отобразить пользователю информацию об этом, но когда мы реализуем Runnable
в нашем интерфейсе Commands, мы не можем выбросить любое исключение из этого потока назад, чтобы добраться до вида.
Что я мог сделать, чтобы постоянно уведомлять пользователя об ошибках и их природе?
Извините за мой английский!
Давайте посмотрим код ниже для краткого примера:
Первая команда
class ChangeMemorySize extends Command {
private String name;
private int memorySizeMb;
public ChangeMemorySize(Hypervisor hypervisor, String server,
String name, int memory) {
super(hypervisor, server);
this.name = name;
this.memorySizeMb = memory;
}
protected void execute() throws ConnectionException,OperationException{
//Some code here
}
public void run() //CANT THROW ANYTHING HERE :throws VmConfigFault,
try{
execute();
}catch{Exception e){
// I have to catch it all here!
}
Это не настоящий код, это всего лишь пример. Затем эта команда будет передана менеджеру, который запустит ее в другом потоке. Но я теряю все специфические исключения, которые я использовал, чтобы уведомить пользователя о том, что на самом деле там произошло!