2016-06-24 7 views
0

Это исключение является обычным явлением в случаях, когда данная служба не работает. Но этот случай отличается: У меня есть маршрут верблюда, на который я написал интеграционные тесты. Сам маршрут работал в производственной-среде, но в тестах, издевались конечная точка не вызывается и маршрут завершается с (укороченный):Apache camel jetty RestletOperationException при вызове запроса 1001, когда высмеивается конечная точка рестарта

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] 

Я был удивлен, что издеваться слушает и реагирует на данном веб-сайте: http://localhost:9000/data/v2/users/17?projection=full но это не получал никакого ответа во время тестов.

Более подробное описание: Существует три модуля (назовите их A, B и C), каждый из которых работает в своем встроенном причале. Я хочу покрыть модуль интеграционных тестов A, и поэтому мне нужно было издеваться над всеми вызовами от модуля A к модулям B и C. Я получил правильное название mock of B, но mock C не был вызван и тест завершился неудачно с исключением выше. Во время испытаний оконечных издевались на С (который не был достижим тестами) были достижимы с помощью завиток звонков с одинаковыми заголовками и т.д ..

ответ

0

Это странное исключение было вызвано, потому что я не правильно удалить заголовки HTTP с помощью: .removeHeaders("org.restlet.http.headers") // remove HTTP headers from incoming request в маршрутах после отдыха призывает к модулю B. Я попытался добавить это удалить заголовки издевались ответа модуля B (поскольку удаление заголовков делается в этом модуле)

 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))); 
        }); 

, но это не помогло.

Таким образом, мне пришлось изменить «производственный маршрут» модуля A путем удаления заголовков после вызова модуля B. Тогда издевавшийся модуль C был вызван без проблем.

... если только было более информативное исключение брошено :(