Я бросаю вам вызов:)
У меня есть процесс, который кто-то уже реализовал. Я попытаюсь описать требования, и я надеялся, что смогу получить какой-то вклад в «лучший способ» сделать это.
<ч />
Это для финансового учреждения.
У меня есть структура маршрутизации, которая позволит мне получать файлы и отправлять запросы в другие системы. У меня есть база данных, которую я могу использовать по своему усмотрению, но только я и мое программное обеспечение имеют доступ к этой базе данных.
Факты
- Через фреймворк получаю файл.
- Каждая строка в этом файле соответствует формату фиксированной длины с указанием лица и суммы (+ много других материалов).
- Этот файл в 99% случаев находится ниже 100 МБ (около 800 байт на строку, т.е. 2,2 МБ = 2600 строк)
- Один раз в год вместо этого у нас есть 1-3 ГБ данных.
- Запуск на "appserver"
- Я могу форковать подпроцессы так, как мне нравится. (в пределах разумного)
- Не могу обеспечить согласованность при работе более двух дней. подпроцессы могут прекратиться, соединение с базой данных / платформой может быть потеряно, файлы могут переместиться
- Я не могу отправлять надежные сообщения через фреймворк. Звонок синхронный, поэтому я должен дождаться ответа.
- Возможно / вероятно, что отправка этих запросов getPerson приведет к сбою моего "процесса" при отправке LOTS.
- Мы используем Java.
Требования
- Я должен вернуть файл со всеми данными + Я должен добавить дополнительную информацию для некоторых строк. (около 25-50% строк: не менее 25.000)
- Эту информацию я могу получить, только выполнив запрос getPerson через инфраструктуру к другой системе. Один на человека. Занимает от 200 до 400 мсек.
- Должно быть в состоянии завершить в течение двух дней
Приятно иметь
- Checkpointing. Если я собираюсь работать в течение длительного времени, я уверен, что хотел бы иметь возможность перезапустить процесс, не начиная с самого начала.
...
Как бы вы спроектировали это?
Позже я добавлю текущий хак и мою краткую идею
========== Текущее решение ================
Он работает на BEA / Oracle Weblogic Integration, не по выбору, а по определению
Когда файл получен, каждая строка считывается в базу данных с
id, line, status,batchfilename
и статус «Требуется обработка»
Когда все строки находятся в базе данных, строки разделяются по модулю 4, и процесс запускается для каждой четверти строк, и каждая нуждающаяся в нем строка обогащается вызовом getPerson, а статус устанавливается на «Обработано». (38,0000 в текущей партии).
Когда все 4 четверти строк обработаны, процесс записи запускается путем выбора 100 строк из этой базы данных, записи их в файл и обновления их статуса на «Записано».
Когда все готово, новый файл передается обратно в инфраструктуру маршрутизации, и операционная команда отправляет электронное письмо с сообщением «я готов».
4 процесса обработки могут / не получатся, поэтому можно перезапустить их с помощью http get для сервлета в WLI.