2016-06-24 16 views
0

Diese Ausnahme tritt häufig auf, wenn der angegebene Dienst nicht ausgeführt wird. Aber dieser Fall ist anders: Ich habe Kamelroute, für die ich Integrationstests schrieb. Route selbst wurde in produktionsähnlichen Umgebung zu arbeiten, aber in Tests wird verspottet Endpunkt nicht genannt und Strecke nicht mit (verkürzt):Apache camel jetty RestletOperationException beim Aufruf der Anforderung 1001 bei angehaltenem Restlet-Endpunkt

java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_91] 
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[na:1.8.0_91] 
    at java.net.SocketInputStream.read(SocketInputStream.java:170) ~[na:1.8.0_91] 
    at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_91] 
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:160) ~[httpcore-4.4.1.jar:4.4.1] 
    ... 
    at org.restlet.ext.httpclient.internal.HttpMethodCall.sendRequest(HttpMethodCall.java:339) ~[org.restlet.ext.httpclient-2.3.5.jar:na] 
    at org.restlet.engine.adapter.ClientAdapter.commit(ClientAdapter.java:105) [org.restlet-2.3.5.jar:na] 
    at org.restlet.engine.adapter.HttpClientHelper.handle(HttpClientHelper.java:119) [org.restlet-2.3.5.jar:na] 
    at org.restlet.Client.handle(Client.java:153) [org.restlet-2.3.5.jar:na] 
    at org.restlet.Restlet.handle(Restlet.java:275) [org.restlet-2.3.5.jar:na] 
    at org.apache.camel.component.restlet.RestletProducer.process(RestletProducer.java:79) [camel-restlet-2.16.0.jar:2.16.0] 
    ... 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91] 
15:35:38.913 [qtp995381766-39] WARN o.e.jetty.servlet.ServletHandler - /data/v2/users/17 
org.apache.camel.RuntimeCamelException: org.eclipse.jetty.io.EofException: Early EOF 
    at org.apache.camel.http.common.HttpMessage.createBody(HttpMessage.java:68) ~[camel-http-common-2.16.0.jar:2.16.0] 
    at org.apache.camel.impl.MessageSupport.getBody(MessageSupport.java:41) ~[camel-core-2.16.0.jar:2.16.0] 
    at org.apache.camel.http.common.DefaultHttpBinding.readRequest(DefaultHttpBinding.java:97) ~[camel-http-common-2.16.0.jar:2.16.0] 
    .. 
Caused by: org.eclipse.jetty.io.EofException: Early EOF 
    at org.eclipse.jetty.server.HttpInput$3.noContent(HttpInput.java:506) ~[jetty-server-9.2.10.v20150310.jar:9.2.10.v20150310] 
    at org.eclipse.jetty.server.HttpInput.read(HttpInput.java:124) ~[jetty-server-9.2.10.v20150310.jar:9.2.10.v20150310] 
    at java.io.InputStream.read(InputStream.java:101) ~[na:1.8.0_91] 
    at org.apache.camel.util.IOHelper.copy(IOHelper.java:196) ~[camel-core-2.16.0.jar:2.16.0] 
    at org.apache.camel.util.IOHelper.copy(IOHelper.java:169) ~[camel-core-2.16.0.jar:2.16.0] 
    at org.apache.camel.util.IOHelper.copyAndCloseInput(IOHelper.java:218) ~[camel-core-2.16.0.jar:2.16.0] 
    at org.apache.camel.util.IOHelper.copyAndCloseInput(IOHelper.java:214) ~[camel-core-2.16.0.jar:2.16.0] 
    at org.apache.camel.http.common.HttpHelper.readResponseBodyFromInputStream(HttpHelper.java:244) ~[camel-http-common-2.16.0.jar:2.16.0] 
    at org.apache.camel.http.common.HttpHelper.readRequestBodyFromServletRequest(HttpHelper.java:195) ~[camel-http-common-2.16.0.jar:2.16.0] 
    at org.apache.camel.http.common.DefaultHttpBinding.parseBody(DefaultHttpBinding.java:492) ~[camel-http-common-2.16.0.jar:2.16.0] 
    at org.apache.camel.http.common.HttpMessage.createBody(HttpMessage.java:66) ~[camel-http-common-2.16.0.jar:2.16.0] 
    ... 23 common frames omitted 
15:35:38.949 [Restlet-167550865] ERROR o.a.c.processor.DefaultErrorHandler - Failed delivery for (MessageId: ID-nb-mensik-61516-1466775296892-0-3 on ExchangeId: ID-nb-mensik-61516-1466775296892-0-2). Exhausted after delivery attempt: 1 caught: org.apache.camel.component.restlet.RestletOperationException: Restlet operation failed invoking http://localhost:9000/data/v2/users/17?projection=full with statusCode: 1001 /n responseBody:HTTP/1.1 - Communication Error (1001) - The connector failed to complete the communication with the server 

org.apache.camel.component.restlet.RestletOperationException: Restlet operation failed invoking http://localhost:9000/data/v2/users/17?projection=full with statusCode: 1001 /n responseBody:HTTP/1.1 - Communication Error (1001) - The connector failed to complete the communication with the server 
    at org.apache.camel.component.restlet.RestletProducer.populateRestletProducerException(RestletProducer.java:232) ~[camel-restlet-2.16.0.jar:2.16.0] 
    at org.apache.camel.component.restlet.RestletProducer.process(RestletProducer.java:84) ~[camel-restlet-2.16.0.jar:2.16.0] 
    at org.apache.camel.component.restlet.RestletProducer.process(RestletProducer.java:98) ~[camel-restlet-2.16.0.jar:2.16.0] 
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:141) [camel-core-2.16.0.jar:2.16.0] 
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460) [camel-core-2.16.0.jar:2.16.0] 

ich, dass Mock war überrascht zu hören und auf bestimmte URL reagiert: http://localhost:9000/data/v2/users/17?projection=full aber es bekam während der Tests keine Antwort.

Konkrete Beschreibung: Es gibt drei Module (nennen sie A, B und C) jeweils in seiner eingebetteten Anlegestelle ausgeführt. Ich möchte durch Integration Tests Modul A abdecken und so musste ich alle Aufrufe von Modul A zu den Modulen B und C verspotten. Ich wurde korrekt als Mock von B, aber Mock C wurde nicht aufgerufen und Test mit Ausnahme oben fehlgeschlagen. Bei Tests verspottet Endpunkte von C (die durch Versuche nicht erreichbar waren) waren erreichbar curl Anrufe mit dem gleichen Header etc ..

Antwort

0

Diese seltsame Ausnahme ausgelöst wurde, weil ich nicht richtig HTTP-Header entfernen Verwendung: .removeHeaders("org.restlet.http.headers") // remove HTTP headers from incoming request in Routen nach Ruhe (in diesem Modul erfolgt seit Header zu entfernen)

 authorizationServiceMock.whenExchangeReceived(1, 
        exchange -> { 
         assertEquals(exchange.getIn().getHeader(HTTP_PATH, String.class), "/authorization/Bearer MagicToken"); 
         exchange.getIn().setHeader(CONTENT_TYPE, APPLICATION_JSON); 
         exchange.getIn().removeHeaders(ATTRIBUTE_HEADERS); 
         exchange.getIn().setBody(objectMapper.writeValueAsBytes(new UserToken("MagicToken", 17L))); 
        }); 

nennt diese Header verspottet Antwort des Moduls B entfernen Modul B. ich habe versucht, hinzuzufügen, aber es hat nicht geholfen.

Also musste ich "Produktionsroute" von Modul A durch diese Entfernung von Headern nach Aufruf von Modul B ändern. Dann wurde Mocked-Modul C ohne Problem aufgerufen.

... wenn nur mehr informative Ausnahme geworfen würde :(