2017-02-22 2 views
0

Ich benutze Camel Spring-ws-Komponente, um SOAP-Web-Service bereitzustellen, indem Sie es im 'von' Teil der Route angeben.Apache Camel Spring Webservices SpringWebserviceConsumer liest keine Antwort von innerhalb, wenn nicht aus

Es ist zufällig, dass am Ende der Route-Logik die 'out' Nachricht von Exchange nicht aufgefüllt wird, jedoch enthält die 'in' Nachricht die gewünschten Antwortdaten.

Die Standardkonvention für die Erzeugerkomponente besteht darin, eine 'in'-Nachricht des Austauschs zu verwenden, wenn' out 'beim Erzeugen der endgültigen Antwort nicht vorhanden ist.

Der SpringWebserviceConsumer unterstützt jedoch nur das Szenario, wenn der letzte Austausch die Nachricht 'out' hat. Hier ist der Code-Snippet von https://github.com/apache/camel/blob/master/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConsumer.java:

public void invoke(MessageContext messageContext) throws Exception { 
    Exchange exchange = getEndpoint().createExchange(ExchangePattern.InOptionalOut); 
    populateExchangeFromMessageContext(messageContext, exchange); 

    // start message processing 
    getProcessor().process(exchange); 

    if (exchange.getException() != null) { 
     throw exchange.getException(); 
    } else if (exchange.getPattern().isOutCapable()) { 
     Message responseMessage = exchange.getOut(Message.class); 
     if (responseMessage != null) { 
      Source responseBody = responseMessage.getBody(Source.class); 
      WebServiceMessage response = messageContext.getResponse(); 

      configuration.getMessageFilter().filterConsumer(exchange, response); 

      XmlConverter xmlConverter = configuration.getXmlConverter(); 
      xmlConverter.toResult(responseBody, response.getPayloadResult()); 
     } 
    } 
} 

Dies führt zu keiner Reaktion erzeugt an den SOAP-Anfrage.

Frage: Ist das ein Bug/Einschränkung von Kamel-Feder-ws oder ich bin nicht die Feder-ws Verbraucher richtig mit?

Sonst klingt es so, als müsste ich das Exchange-Muster explizit auf InOut setzen?

+0

Gibt es eine Warum erstellen Sie Ihren Austausch explizit mit dem Austauschmuster "InOptionalOut" anstelle von "InOut"? WS-Operationen erwarten normalerweise eine Antwort, wenn sie nicht auf "InOnly" festgelegt wurden. – noMad17

+0

Warum legen Sie das Austauschmuster fest? Sie können das Standardmuster von InOnly verwenden. –

+0

Aktualisierte Beschreibung mit Verweis auf die SpringWebserviceConsumer-Klasse von camel-spring-ws, das ist nicht mein Code. –

Antwort

0

Bis CAMEL-10888 freigegeben wird, als Behelfslösung, in der Route, können Sie den Wechselmuster InOut liegt, kann nicht null 'out' Nachricht von Exchange zu erhalten:

.setExchangePattern(ExchangePattern.InOut)