Das Problem ist nicht Frühling. Ich denke, dass Sie eine Warteschlange mit Elementen benötigen, die die Anfrage enthalten und eine Antwort anbieten. Aber die Antwort muss blockieren, bis das Element dequed und verarbeitet wird. So sieht das Warteschlangenelement wie folgt aus:
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;
}
}
Der Webservice Enqueining erstellt die BlockingPair mit seinem Anfragekörper. Schiebt dann das BlockingPair-Element in die Warteschlange. Danach erstellt er die Antwort, indem er den Antworttext von der BlockingPair holt, aber blockiert.
Der Verbraucher entwirft einen BlockingPair und stellt den Antwortkörper ein. Von dort schreibt der Webservice die Antwort weiter.
Sie benötigen drei Beans: Webservice, eine blockierende Warteschlange und den Verbraucher. Sowohl der Webservice als auch der Verbraucher benötigen die Warteschlange als Bean-Eigenschaft.
Die Warteschlange und die Consumer-Beans müssen im Anwendungskontext geplant werden (wie von der ContextLoaderListener
initialisiert). Die Warteschlange braucht eine bean ID Referenzen durch den Webservice zu sein (das seinen eigenen Kontext hat, aber der Anwendungskontext als Eltern so kann die Warteschlange Bezug verwiesen werden):
Teil der 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>
Die
applicationContext.xml
enthält zwei Bohnen:
<bean id="queue" class="java.util.concurrent.LinkedBlockingQueue"/>
<bean id="consumer" class="...">
<property name="queue" ref="queue"/>
</bean>
Der Webservice hat seine eigene Kontextdefinition, hier service-servlet.xml
:
<bean id="endpoint" class="org.springframework.ws.server.endpoint....PayloadEndpoint">
<property name="queue" ref="queue"/>
</bean>
Weitere Informationen zum Definieren eines Endpunkts der Feder ws finden Sie unter spring tutorial.
Der Verbraucher muss eine Hintergrundaufgabe sein, also würde ich quartz bevorzugen, für die Federintegration siehe here.
Wenn Sie sagen FIFO-Warteschlange meinen Sie eine QueueChannel (http://static.springframework.org/spring-integration/apidocs/org/springframework/integration/channel/QueueChannel.html), eine JMS-Warteschlange, oder etwas anderes? –
Ein Queue-Kanal, ja –