Разветвление JVM при использовании spring-batch

#java #spring #spring-batch #fork

#java #spring #spring-batch #fork

Вопрос:

Я новичок в Spring-Batch и хочу использовать его для пакетной обработки некоторых заданий, в которых используется устаревшая библиотека. У этой библиотеки есть недостатки:

  • быть не потокобезопасным
  • экземпляр некоторых объектов в библиотеке не может обрабатывать несколько заданий подряд (из-за вложенных одноэлементных статических экземпляров).

Таким образом, кажется, что единственным решением является разветвление JVM для каждого задания.

Мой вопрос: как я могу это сделать, используя spring-batch? Большинство решений в документации ориентированы на потоки.

Комментарии:

1. как вы запускаете задания с помощью spring batch admin? командная строка?

2. @MichaelLange Я использую API Spring Batch в своей основной программе.

Ответ №1:

«разветвить JVM» — как бы вы это сделали? Полностью запустить новый процесс? Но на самом деле это не приведет к «разветвлению» JVM — это означает, что любая информация о состоянии, которую вам нужно скопировать в «дочернюю» JVM, должна быть выполнена вручную. Как насчет того, чтобы как-то использовать другой загрузчик классов для каждого задания?

Комментарии:

1. Да, вы правы: я не знал, что JVM не была «libc-подобной» для разветвления. Загрузчик классов кажется хорошим решением, но я боюсь столкнуться с PermGenSpace ошибкой из-за нескольких статических элементов, не удаленных сборщиком мусора…

2. Это было то, с чем мы сталкивались и с Tomcat во время разработки, когда мы многократно повторно развертывали приложение без перезапуска сервера. Затем увидел эти флаги JVM «CMSClassUnloadingEnabled» и «CMSPermGenSweepingEnabled». Но к этому времени можно было бы просто подумать о замене устаревшей библиотеки чем-то другим.

3. к сожалению, мы должны признать это: в настоящее время мы не можем заменить эту библиотеку

4. @Kartoch, какую JRE вы используете, «CMSClassUnloadingEnabled» и «CMSPermGenSweepingEnabled» не поддерживаются?