2016-08-25 5 views
2

У меня есть свой собственный класс, который реализует com.ibm.websphere.asynchbeans.Work со следующим способом выполнения:Как исключить исключение из задачи StartWork в Websphere?

@Override 
public void run() { 
    try { 
    agentManager.loadLibContent(agent); 
    } catch (Exception e) { 
    ErrorAnalizer.report(e); 
    log.error("some err: "+e.getMessage()); 
    //this.setStatus("error"); 
    //throw new RuntimeException(e); 
    } finally { 
    workLoadManager.delRunTask(getTaskHistory()); 
    } 
} 

Эта работа класса передается StartWork метод (работа var1) в com.ibm.websphere.asynchbeans.WorkManager.

Когда я получаю исключение в блоке try, он попадает и регистрируется, без проблем.

Но Я хочу, чтобы это исключение прошло до тех пор, пока оно не достигнет самого первого метода, который называется startWork в websphere.

Как это сделать?Runnable не позволяет выбросить проверенное исключение. RuntimeException не помогло. Кажется, startWork проглатывает его где-то внутри.

Плохо, что этот первый метод находится в другом модуле проекта, и я не могу дотянуться до него из блока catch, чтобы передать информацию, чтобы выполнить некоторую работу.

Я также попытался установитьStatus в своем рабочем классе, а затем получить его после, но похоже, что startWork не позволяет мне изменять переданный объект.

Любая помощь приветствуется. Спасибо!

ответ

3

Вы должны использовать WorkItem.getResult метод:

MyWork myWork = ... 
WorkItem wi = wm.startWork(myWork); 
... 
try { 
    myWork = (MyWork)wi.getResult(); 
    ... 
} catch (WorkException e) { 
    Throwable cause = e.getCause(); 
    ... 
} 

Тогда есть два варианта:

  1. Улов блок в методе run может хранить исключение в поле экземпляра, а затем вы можете получить его после вызова getResult.
  2. Метод run выбрасывает исключение, и оно должно быть доступно в качестве причины уловленного WorkException.
1

Чтобы получить результат, представленного asynchbeans Work, вы можете сохранить ссылку на com.ibm.websphere.asynchbeans.WorkItem и вызывать getResult(), которая будет возвращать результат вашей работы, если она успешно завершено, или он будет бросать com.ibm.websphere.asynchbeans.WorkException который оборачивает исключение брошенного по реализации Work.

Вот пример:

// Submit the work 
WorkItem workItem = workManager.startWork(new MyWork()); 

// Wait for the work to be done for up to 60s 
ArrayList<WorkItem> items = new ArrayList<WorkItem>(); 
boolean workFinished = workManager.join(items, WorkManager.JOIN_AND, 60*1000); 

if(workFinished) 
    try { 
    MyWork work = workItem.getResult(); 
    // if we get here, the work completed without errors 
    } catch(WorkException e) { 
    throw e.getCause(); // this will be the exception thrown by your Work impl 
    } 
else { 
    // the Work did not finish in 60s 
}