2015-06-29 3 views
0

Я пытаюсь создать класс java, который будет подключаться к онлайн-службе, искать значение и затем обновлять это значение в моей базе данных. Это относительно простая задача, но поскольку это большой набор значений, у меня есть условие выполнения этой задачи в кусках данных (скажем, 100). (?)Сценарий синхронизации в Java

Так что ServiceSyncer класс должен выполнить следующий псевдокод:

while (select Objects where timestamp < today, limit 100) returns items { 
foreach Object { 
try { 
    connect to Service for Object.attribute 
    extract attribute value 
    If attribute value has changed { 
     update Object { 
     set attribute value 
     } 
    } 
    } catch exception { 
    log exception 
    } 
    update timestamp = now() 
    } 
} 

Этот цикл будет обновлять все объекты в куски 100, пока все объекты не будут посмотрел. Объекты, которые не выполнялись во время поиска, останутся неудачными, пока в следующий раз синхронизация не будет выполнена.

Что было бы концептуально хорошим подходом к решению этой проблемы?

** Приведенный выше псевдокод выглядит менее устаревшим при попытке его реализовать.

Нечто подобное будет работать, но я интересно, если есть лучший способ

JAVA

boolean keepProcessing = true; 
    int startIndex = 0; 
    int endIndex = 0; 

    while (keepProcessing) { 
     endIndex = startIndex + 100; 
     if (endIndex > publist.size() - 1) { 
      endIndex = publist.size() - 1; 
      keepProcessing = false; 
     } 

     List<ObjectJPA> currentBatchList = publist.subList(startIndex, endIndex); 

     for (int i = 0; i < currentBatchList.size(); i++) { 
      // do staff 
     } 

     repository.save(currentBatchList); 
    } 
+0

Не уверен, что вы подразумеваете под «Что было бы концептуально хорошим подходом к решению этой проблемы?», Похоже, у вас есть концепция. – Taylor

+0

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

+0

Возможно, проблемы связаны с деталями вашей реализации. Ваш псевдо-код кажется прекрасным, но реализация такого рода вещей может быть искажена деталями запроса, проблемами границ транзакций и т. Д. – Taylor

ответ

1

Поскольку у меня нет достаточно очков, чтобы предоставить комментарий, я представляю мое решение, как Ответ вместо комментария.

Я предпочитаю другой подход для обновления состояния вашего объекта

ВАРИАНТ A:

1) Вы можете получить состояние объекта из базы данных в службе А.

2) Когда это изменение объекта в вашем онлайн-сервисе B, эта услуга будет просто уведомлять вашу службу A через служебный вызов (предпочтительный HTTP-вызов)

3) Вы замените весь цикл while на сервисный вызов. Если есть изменения в объекте, начиная с шагом 1, то только обновление модифицированного объекта в базе данных от службы А.

ВАРИАНТ B:

1) Поддерживать распределенный кэш между этими двумя службами. Если есть изменение в объекте, то только обновить базу данных с измененным значением.

+0

Я рад, что вы не пытались написать эту сумму текста в качестве комментария ... –

+0

должен выполняться как скрипт синхронизации в определенное время и час дня. Он не предназначен для использования с уведомлениями. Он просто проверяет статус, когда я хочу его проверить и соответствующим образом обновить:/ –

+0

Ваша логика Pesudo в порядке. Добавьте службу ThreadPoolExecutor или Executor для быстрой обработки. Получение объекта из базы данных онлайн-обслуживания и обновления может быть частью задачи, связанной с вызовом. http://stackoverflow.com/questions/30782611/unable-to-get-callablethread-in-rejectionhandler имеет один образец, относящийся к заданию для вызова –

Смежные вопросы