2015-01-12 3 views
0

Мы оцениваем 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.

Итак, если до сих пор я все понял, это кажется немного неуклюжей работой, поэтому я надеюсь, что что-то пропустил, и есть гораздо лучший способ справиться с этим относительно простым случаем асинхронного вызова.

С нетерпением ждем любых полезных отзывов, спасибо заблаговременно.

ответ

1

Ваш код выглядит правильно, и я не вижу никаких проблем при вызове метода jobFinished из будущего закрытия слушателя.Вы объявили его анонимным классом, который всегда имеет ссылку на внешний класс (GridClient в вашем случае), поэтому у вас есть доступ ко всем переменным и методам экземпляра GridClient.

+0

Valentin, спасибо за обратную связь! По какой-то причине это не сработало при попытке в первый раз - это привело к ошибке компиляции. Когда я снова пробовал этот код в новом проекте, все работало плавно. Пойдите фигурой ... Во всяком случае, спасибо еще раз. –