Справедливое предупреждение, я не использовал Spring в Storm, так что это основано исключительно на моих знаниях Storm и использовании Spring в не-Storm проектах, то есть на самом деле это просто догадки.
Я думаю, что вы можете использовать Spring с Storm, но есть некоторые предостережения, о которых вы должны знать. Стоит ли использовать Spring с учетом этих предостережений, решать только вам.
В отличие от, например, Spring MVC-приложение Spring не будет отвечать за создание экземпляров объекта или выполнение приложения. Storm не знает о Spring, и когда вы запускаете топологию, это будет Storm, который вызывает ваши методы работы с болтами / носиками. Это означает, что вы должны знать, что некоторые части вашего приложения будут вызываться вне контекста Spring.
Вот мое предположение, где вы могли бы использовать Spring на разных этапах развертывания топологии.
Когда вы настраиваете свою топологию и отправляете ее (весь ваш код до StormSubmitter.submitTopology
включительно), вы, скорее всего, можете использовать Spring так же, как и в любом автономном приложении Java. например Вы можете запустить свое приложение, как в в этом примере , и поместить все свои документы и код подключения в Main.start
. Все конструкторы болтов / изливов будут работать на этом этапе, так что вы можете использовать здесь автоматическое подключение, если хотите. Вы должны убедиться, что ваши носики и болты являются сериализуемыми.
После отправки топологии Storm будет сериализовать ваши носики и болты (и любые непереходные поля в этих объектах) и отправит их на машины супервизора, где они будут десериализованы. На этом этапе, если вам нужен контекст, доступный в работнике, вы можете создать его в работник хук (добавленный в топологию через TopologyBuilder.addWorkerHook
) и выставить его с помощью статического метода на хуке (который немного уродливо, но я не вижу другого способа сделать его доступным для других частей кода).
Еще раз повторю: если вы решите запустить контекст Spring внутри своих работников, вы должны знать, что методы spout / bolt будут вызываться Storm вне контекста Spring.