Я пытаюсь разработать разумно масштабируемую инфраструктуру пакетной обработки для веб-приложения, которое я пишу.
Я использую Spring MVC для веб-приложения со специальным слоем DAO (для доступа к базе данных требуется экземпляр UnitOfWork , созданный из UnitOfWorkFactory , который установлен как @ Автоматически подключается и вводится во время выполнения Spring).
Я использую аннотации Spring Scheduler (@Scheduled) для планирования задач, однако я хочу, чтобы эти задачи выполнялись на разных машинах в моем кластере. Каждое пакетное задание должно быть подобрано на одной из машин кластера и затем выполнено.
Hazelcast казался естественным подходом для этого, поскольку дизайн Distributed Execution казался действительно простым и элегантным для этой цели.
Я столкнулся с проблемой, которая, похоже, не описана в документации. Я прочитал документацию о Spring Integration , но, похоже, основное внимание уделяется настройке Hazelcast с использованием Spring (что я уже сделал).
Когда планировщик указывает, что задача запускается, я хочу создать новый экземпляр задачи ( Callable экземпляр) и передать его DistributedExecutor . Когда машина кластера получает задачу для запуска, мне нужен контейнер Spring на машине кластера, чтобы внедрить экземпляр UnitOfWorkFactory в пакетную задачу, прежде чем задача попытается выполнить ее. Каждый из кластеров начинается с Spring и будет иметь экземпляр UnitOfWorkFactory , уже созданный с правильными деталями, проблема заключается в получении экземпляра UnitOfWorkFactory , внедренного в мою задачу.
Кто-нибудь знает, как я могу настроить свое приложение так, чтобы Hazelcast мог автоматически UnitOfWorkFactory вводиться при запуске Callable ? Я попытался пометить Callable как Сериализуемый и ApplicationContextAware , но я все еще получаю NullPointerException при попытке запустить задачу.
Я мог бы получить доступ к ApplicationContext напрямую, однако я бы предпочел не делать этого, поскольку он ограничит тестируемость моих задач и введет жесткую зависимость от Spring для моих пакетных заданий.