Мы оцениваем Grid Gain 6.5.5 на данный момент как потенциальное решение для распределения вычислительных заданий по сетке. Проблемой, с которой мы сталкиваемся в данный момент, является отсутствие подходящего механизма асинхронного уведомления, который будет асинхронно уведомлять отправителя после завершения работы (или будущего завершения).Решение для асинхронного уведомления о будущем завершении в GridGain необходимо
Архитектура прототипа относительно проста, а основная проблема представлена ниже в псевдокоде (полный код не может быть опубликован из-за NDA). *** Важно - код представляет только «проблему», рассматриваемое возможное решение описывается в тексте внизу вместе с вопросом.
//will be used as an entry point to the grid for each client that will submit jobs to the grid
public class GridClient{
//client node for submission that will be reused
private static Grid gNode = GridGain.start("config xml file goes here");
//provides the functionality of submitting multiple jobs to the grid for calculation
public int sendJobs2Grid(GridJob[] jobs){
Collection<GridCallable<GridJobOutput>> calls = new ArrayList<>();
for (final GridJob job : jobs) {
calls.add(new GridCallable<GridJobOutput>() {
@Override public GridJobOutput call() throws Exception {
GridJobOutput result = job.process();
return result;
}
});
}
GridFuture<Collection<GridJobOutput>> fut = this.gNode.compute().call(calls);
fut.listenAsync(new GridInClosure<GridFuture<Collection<GridJobOutput>>>(){
@Override public void apply(GridFuture<Collection<GridJobOutput>> jobsOutputCollection) {
Collection<GridJobOutput> jobsOutput;
try {
jobsOutput = jobsOutputCollection.get();
for(GridJobOutput currResult: jobsOutput){
//do something with the current job output BUT CANNOT call jobFinished(GridJobOutput out) method
//of sendJobs2Grid class here
}
} catch (GridException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
return calls.size();
}
//This function should be invoked asynchronously when the GridFuture is
//will invoke some processing/aggregation of the result for each submitted job
public void jobFinished(GridJobOutput out) {}
}
}
//represents a job type that is to be submitted to the grid
public class GridJob{
public GridJobOutput process(){}
}
Описание:
Идея заключается в том, что GridClient экземпляр будет использоваться для того, чтобы представить список/массив рабочих мест в сети, уведомить отправителя, как было представлено много работ, и когда рабочие места (асинхронно) будет выполнять некоторую обработку результатов. Для части обработки результатов необходимо вызвать метод GridClient.jobFinished (GridJobOutput out).
Теперь, находясь под вопросом, мы знаем о интерфейсе GridInClosure, который может использоваться с «GridFuture.listenAsync (GridInClosure> lsnr)» , чтобы зарегистрировать будущего слушателя. Проблема (если мое понимание правильное) заключается в том, что это хорошее и довольно простое решение в случае, если результат будущего должен быть «обработан» кодом, находящимся в пределах данного GridInClosure. В нашем случае нам нужно использовать «GridClient.jobFinished (GridJobOutput out)», который выходит за рамки.
Из-за того, что GridInClosure имеет один аргумент R и должен быть того же типа, что и для результата GridFuture, кажется невозможным использовать этот подход простым способом.
Если бы я получил это право до сих пор, то для того, чтобы использовать «GridFuture.listenAsync (..)» ПОДХОД следующее должно быть сделано:
- GridClient будет реализовать интерфейс, предоставляющий доступ к «jobFinished (..)» метод давайте назовем его GridJobFinishedListener.
- GridJob должен быть «завернут» в новый класс, чтобы иметь дополнительное свойство типа GridJobFinishedListener.
- GridJobOutput должен быть «завернут» в новый класс, чтобы иметь свойство addtional типа GridJobFinishedListener.
- Когда GridJob будет выполнен в дополнение к «стандартным» результатам, GridJobOutput будет содержать соответствующую ссылку GridJobFinishedListener.
- Учитывая приведенные выше модификации, теперь GridInClosure можно использовать и в методе apply (GridJobOutput), можно будет вызвать метод GridClient.jobFinished (GridJobOutput out) через интерфейс GridJobFinishedListener.
Итак, если до сих пор я все понял, это кажется немного неуклюжей работой, поэтому я надеюсь, что что-то пропустил, и есть гораздо лучший способ справиться с этим относительно простым случаем асинхронного вызова.
С нетерпением ждем любых полезных отзывов, спасибо заблаговременно.
Valentin, спасибо за обратную связь! По какой-то причине это не сработало при попытке в первый раз - это привело к ошибке компиляции. Когда я снова пробовал этот код в новом проекте, все работало плавно. Пойдите фигурой ... Во всяком случае, спасибо еще раз. –