Я хочу использовать шлюз в нескольких потоках. Мое определение шлюза:
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public MarshallingWebServiceOutboundGateway myServiceGateway() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setPackagesToScan("blah.*");
MarshallingWebServiceOutboundGateway gateway = new MarshallingWebServiceOutboundGateway(
serviceEndpoint, marshaller, messageFactory);
gateway.setMessageSender(messageSender);
gateway.setRequestCallback(messageCallback);
return gateway;
}
Обратите внимание, что я определил bean-компонент шлюза сообщений в прототипе области видимости, чтобы Spring создавал несколько экземпляров шлюза. Тем не менее при запуске я получаю это сообщение:
Caused by: java.lang.IllegalArgumentException: A reply MessageProducer may only be referenced once (myServiceGateway) - use @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) on @Bean definition.
Почему он настаивает на том, что на шлюз нельзя ссылаться более одного раза, и как я могу использовать один и тот же шлюз из нескольких потоков?
Использование Spring-Integration 5.0.4
Я думаю, у вас есть что-то вроде .handle(myServiceGateway())
несколько раз.
В этом случае вам необходимо удалить @Bean
и @Scope
из этого метода. И это тоже может быть просто private
. Процесс Java DSL создаст для вас bean-компоненты по этому вопросу. И у каждого потока будет свой экземпляр. Как вы просили.
Компоненты Spring Integration вообще не могут быть @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
. В любом случае на них ссылаются из бинов, не являющихся прототипами (endpoints
). Так что, по сути, объем ваших прототипов bean-компонентов увеличен.
Можете ли вы показать код, который ссылается на компонент
myServiceGateway
? Я только что провел тест, и у меня все сработало. Также добавьте полную трассировку стека.