30-секундная периодическая задача для опроса внешнего веб-сервиса и кэширования данных - PullRequest
2 голосов
/ 14 марта 2012

Я получаю несколько советов о том, как каждые 30 секунд опрашивать внешний веб-сервис из-за действий сервера Domino.

Небольшой фон ...

Мы отслеживаем местонахождение автомобилей через API TomTom. Теперь у нас есть требование показать это в нашем веб-приложении, наложить на карту (Google, Bing и т. Д.) И смешать с другими данными из нашего приложения. Думайте об этом как об отправке звонков в такси, и мы хотим назначить эти звонки такси (... это не такси \ звонки, а аналогичный процесс). Мы довольно агрессивно обновляем экраны диспетчерских контроллеров, чтобы они могли видеть состояние всех объектов и назначать ближайший автомобиль. Если мы инициируем извлечение данных из обновления экрана пользователя, мы попадаем на некоторую хитрую сторону управляющего сервера, иначе мы получим максимально допустимые запросы в минуту к API TomTom.

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

Таким образом, в настоящее время у нас осталось: наш .net парень создаст сервис, который опрашивает TomTom каждые 30 сек, и мы получим из его сервиса, или я найду способ сделать это в Domino. Было бы неплохо сделать это в базе данных Domino, а не в каком-то отдельном java-приложении или .net, чтобы сохранить как можно больше логики в одной системе (Domino).

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

Заранее спасибо,

Ник

Ответы [ 4 ]

8 голосов
/ 15 марта 2012

Извлечение DOTS (Domino OSGi Tasklet Service): http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=OSGI%20Tasklet%20Service%20for%20IBM%20Lotus%20Domino

Это позволяет вам определять фоновые задачи Java на сервере Domino, которые имеют все преимущества агентов (могут быть запланированы или запущены) ни с однимвопросов производительности или обслуживания.

0 голосов
/ 15 марта 2012

Как сказал Тим DOTS или как jjtbsomhorst сказал поток или задание Eclipse.

Я создал видео, описывающее DOTS: http://www.youtube.com/watch?v=CRuGeKkddVI&list=UUtMIOCuOQtR4w5xoTT4-uDw&index=4&feature=plcp

В следующий понедельник я опубликую примеркак делать темы и задания Eclipse.Вот предварительный просмотр видео: http://www.youtube.com/watch?v=uYgCfp1Bw8Q&list=UUtMIOCuOQtR4w5xoTT4-uDw&index=1&feature=plcp

0 голосов
/ 14 марта 2012

Один из способов сделать это - написать управляемый компонент, созданный в области приложения (он может быть только один ...). В этом управляемом bean-компоненте вы позаботитесь о 30-секундном опросе веб-службы старой доброй реализацией java-веб-службы и java-потоком, который вы начинаете при создании вашего управляемого bean-компонента, например

public class ServicePoller{
  private static myThread = null;

public ServicePoller(){
    if(myThread == null){
    myThread = new ServicePollThread();
(new Thread(myThread)).start());

}
  }


}

class ServicePollThread implements Runnable(){

  private hashMap yourcache = null;

  public ServicePollThread(){

  }


  public void run(){
    while(running){
         doPoll();
         Thread.sleep(4000);
    }
  }
  ....
}

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

Другой вариант - написать сервлет (это было бы возможно с помощью extlib, но я не могу найти информацию прямо сейчас), который выполняет потоки и читает сервис для вас. Затем в вашей базе данных вы сможете прочитать кеш сервлета и использовать его там, где вам нужно.

0 голосов
/ 14 марта 2012

Если вы кэшируете данные в bean-компоненте (область приложения или сеанс). Имейте объект даты, который содержит последнюю обновленную дату. Когда данные запрашиваются, сверяйте последнюю кэшированную дату с текущим временем. Если оно больше / равно 30 секундам, обновите данные.

...