Например, учитывая простой конвейер, такой как:
Pipeline p = Pipeline.create();
p.readFrom(TestSources.items("the", "quick", "brown", "fox"))
.map(mapFn)
.writeTo(Sinks.logger());
, я бы хотел, чтобы mapFn
был чем-то, требующим несериализуемой зависимости для выполнения своей работы.
I знаю, что могу это сделать:
Pipeline p = Pipeline.create();
p.readFrom(TestSources.items("the", "quick", "brown", "fox"))
.mapUsingService(JetSpringServiceFactories.bean("myDependencies"),
MyDependencies::addDependencies);
.map(mapFn)
.writeTo(Sinks.logger());
Это обертывает строки, считываемые из источника, в другой объект, который включает зависимости, предоставляя mapFn
доступ к этим зависимостям без их необходимости вводить в сам этот объект . Это будет работать, но я хочу использовать свою функцию сопоставления вне Jet, а также как часть конвейера, и в этом случае немного странно передавать зависимости вместе с сопоставляемыми элементами, а не просто инициализировать сопоставитель с зависимостями это нужно. Это также вынуждает меня бессмысленно создавать объект-оболочку для каждого элемента в моем потоке / пакете.
В документах говорится, что другой альтернативой является использование аннотации @SpringAware
для Processor
, но я думаю, что это означает использование Core API, о котором в документации говорится: «в основном предлагает вам множество способов сделать ошибки», поэтому я бы предпочел этого избежать.
В обычном Hazelcast IMDG все, что десериализовано, может использовать ManagedContext
для инициализируется, и это, очевидно, относится и к Jet, но функции, фильтры и т. д. c. конвейера обернуты множеством слоев материала конвейера Jet, поэтому, похоже, нет никакого способа добраться до них.
Я что-то упускаю или перечислил все имеющиеся у меня варианты (кроме обращения к какой-то "глобальный" static
объект зависимостей)?