Проблема не в весне. Я думаю, вам понадобится очередь с элементами, содержащими запрос и предлагающими ответ. Но ответ нужно заблокировать, пока элемент не будет истребован и обработан. Таким образом, элемент очереди выглядит так:
public class BlockingPair {
private final RequestBodyType request;
private ResponseBodyType response;
public BlockingPair(RequestBodyType request) {
this.request = request;
}
public RequestBodyType getRequest() {
return request;
}
public ResponseBodyType getResponse() {
while (response == null) {
Thread.currentThread().sleep(10);
}
return response;
}
public void setResponse(ResponseBodyType response) {
this.response = response;
}
}
Служба веб-сервиса создает BlockingPair со своим телом запроса. Затем помещает элемент BlockingPair в очередь. После этого он создает ответ, получая тело ответа от BlockingPair, но блокирует.
Потребитель запрашивает одну BlockingPair и устанавливает тело ответа. Оттуда веб-служба продолжает писать ответ.
Вам нужны три компонента: веб-сервис, очередь блокировки и потребитель. И веб-сервис, и потребитель нуждаются в очереди как свойство bean-компонента.
Очередь и компоненты-потребители должны планироваться в контексте приложения (как инициализировано ContextLoaderListener
). Очередь нуждается в идентификаторе bean-компонента для ссылки веб-сервисом (который имеет свой собственный контекст, но контекст приложения является родительским, поэтому на ссылку на ссылку можно ссылаться):
Часть web.xml
:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>service</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>service</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
applicationContext.xml
содержит два боба:
<bean id="queue" class="java.util.concurrent.LinkedBlockingQueue"/>
<bean id="consumer" class="...">
<property name="queue" ref="queue"/>
</bean>
Веб-сервис имеет свое собственное определение контекста, здесь service-servlet.xml
:
<bean id="endpoint" class="org.springframework.ws.server.endpoint....PayloadEndpoint">
<property name="queue" ref="queue"/>
</bean>
Для получения дополнительной информации об определении конечной точки пружины см. Учебное пособие .
Потребитель должен быть в фоновом режиме, поэтому я бы предпочел кварц , для интеграции пружин см. здесь .