безопасность потоков при использовании Spring WebServiceTemplate и Jaxb2Marshaller - PullRequest
5 голосов
/ 13 августа 2010

Я использую Spring WebServiceTemplate в качестве клиента веб-службы программно, т.е. без создания экземпляра контейнера Spring. Я использую Jaxb2Marshaller для маршалинга / демаршалинга. В моем приложении я создаю один экземпляр SaajSoapMessageFactory и один экземпляр Jaxb2Marshaller. Я также создаю один экземпляр WebServiceTemplate и назначаю ранее созданные экземпляры SaajSoapMessageFactory и Jaxb2Marshaller.

Созданный мной шаблон WebServiceTemplate используется многопоточным способом, то есть несколько потоков могут одновременно вызывать marshalSendAndReceive. Мой вопрос - мой поток конфигурации безопасен? Я обеспокоен Jaxb2Marshaller. Javadoc говорит, что Jaxb2Marshallers не обязательно безопасны для потоков. Как я могу использовать Jaxb2Marshaller потокобезопасным способом без повторной инициализации контекста Jaxb?

Как отступление: рассмотрение примера конфигурации spring-ws в справочнике spring приводит меня к мысли, что Jaxb2Marshaller безопасен для потоков, но Javadoc, похоже, противоречит этому.

Ответы [ 2 ]

6 голосов
/ 14 августа 2010

Javadoc для Jaxb2Marshaller не упоминает о безопасности потоков так или иначе, поэтому я не уверен, почему вы думаете, что это не так. Если бы это не было потокобезопасным, javadoc сказал бы это очень ясно.

Ваша конфигурация синглетонов WebServiceTemplate, SaajSoapMessageFactory и Jaxb2Marshaller идеально подходит и полностью поточно-ориентирована.

0 голосов
/ 13 августа 2010

Создайте несколько Jaxb2Marshaller (скажем, пять), поместите их в пул (используйте LinkedBlockingQueue). Когда вы создаете поток, передайте ему очередь.

Когда поток нужен, take() один из очереди / пула. Когда пул пуст, потоки заблокируют этот вызов.

Когда поток завершается с использованием Jaxb2Marshaller, put(), он возвращается в очередь, чтобы другие потоки могли его использовать.

Если вы обнаружите, что потоки слишком часто блокируют в ожидании маршаллера, добавьте в очередь больше (см. Первый шаг). Таким образом, вы можете легко определить размер пула (или даже сделать его настраиваемым). Затем очередь автоматически распределяет их.

...