Как избежать этой ошибки запроса службы? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть весенний веб-проект, который предоставляет спокойный сервис через URL, который я разместил на своем локальном компьютере для тестирования.

http://localhost:8090/classify?classificationInput={"inputInfo":{"inputText":"how much money","sku":"2"}}

Затем у меня есть спокойный клиент, чтобы отправить запрос на сервер выше и получитьрезультат обратно в виде строки Json.Проблема в том, что если я использую многопоточность для отправки большого количества запросов в службу restful, я получу часть ошибки обработки запроса, как показано ниже.Это связано с тем, что мое веб-приложение отправляет запросы в другую службу покоя для обработки данных, а также потому, что для обработки каждого запроса требуется некоторое время, оно завершается с ошибкой по некоторому запросу и выдает следующее исключение, типичное исключение:

ERROR com.nlu.qe.service.executors.Parser [107] [executeParser] - Parser 
IOException failed! 1887628

как это происходит

http://XX.XX.69.251/LexicalAnalyze?Type=graphjson&Key=Lsdif238fj&action=headdown&Sentence= message

Код этого исключения выглядит следующим образом:

private String executeParser(String sku, String inputText, String msgId) {

    String jsonOutput = null;
    String urlStr = "http://XX.XX.69.251/LexicalAnalyze?Type=graphjson&Key=Lsdif238fj&action=headdown&Sentence=";
    try {
        String encodedInputText = URLEncoder.encode("\"" + inputText + "\"", "UTF-8");
        URL url = new URL(urlStr + encodedInputText);
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        jsonOutput = in.readLine();
        in.close();
        LOGGER.info("{} is parsed by {} {} {}", sku, urlStr, msgId, inputText);
    } catch (UnsupportedEncodingException e) {
        LOGGER.error("Parser UnsupportedEncodingException failed! {} {} {} {}", sku, inputText, urlStr, msgId);
        e.printStackTrace();
    } catch (MalformedURLException e) {
        LOGGER.error("Parser MalformedURLException failed! {} {} {} {}", sku, inputText, urlStr, msgId);
        e.printStackTrace();
    } catch (IOException e) {
        LOGGER.error("Parser IOException failed! {} {} {} {}", sku, inputText, urlStr, msgId);
        e.printStackTrace();
    }
    return jsonOutput;
}

Я предполагаю, что когда большое количество запросов из-за многопоточностиСлужба (показанная в приведенном выше коде) слишком занята, чтобы обработать их все, поэтому некоторые запросы не были выполнены.В частности, эта часть не удалась:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

Является ли это реальной причиной, и если да, то как этого избежать?Я хочу использовать несколько потоков для ускорения процесса.

РЕДАКТИРОВАТЬ:

java.io.IOException: Server returned HTTP response code: 502 for URL: http://xx.xx.69.251/LexicalAnalyze?Type=graphjson&Key=Lsdif238fj&action=headdown&Sentence=%22%23E-s16%E4%BB%8A%E5%A4%A9%E5%87%86%E5%A4%87%E4%B8%8B%E5%8D%95%E5%B1%85%E7%84%B6%E6%B6%A8%E4%BB%B7%E4%BA%86%22
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
    at java.net.URL.openStream(URL.java:1045)
    at com.nlu.qe.service.executors.DParser.executeParser(DParser.java:96)
    at com.nlu.qe.service.executors.DParser.parse(DParser.java:72)
    at com.nlu.qe.service.executors.DParser$$FastClassBySpringCGLIB$$a7e8b65c.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
    at com.ump.annotation.JAnnotation.execJAnnotation(JAnnotation.java:105)
    at sun.reflect.GeneratedMethodAccessor57.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:174)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at com.nlu.qe.service.executors.DParser$$EnhancerBySpringCGLIB$$2749ab39.parse(<generated>)
    at com.nlu.qe.service.ClassificationService.classifyQuestion(ClassificationService.java:24)
    at com.nlu.qe.service.JnluQEServiceImpl.getClassification(JnluQEServiceImpl.java:95)
    at com.nlu.qe.service.JnluQEServiceImpl$$FastClassBySpringCGLIB$$71039dbb.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at com.nlu.qe.service.JnluQEServiceImpl$$EnhancerBySpringCGLIB$$a1da74b6.getClassification(<generated>)
    at com.nlu.qe.controller.QueryEngineController.classify(QueryEngineController.java:105)
    at sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:891)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

1 Ответ

0 голосов
/ 30 сентября 2018

Таким образом, ошибка 502, указанная в журналах ошибок, указывает на то, что ошибка происходит на стороне сервера, а не на стороне клиента.Код 502 обычно означает «плохой шлюз», так что это либо что-то не так с самим сервером, либо с некоторым шлюзом / прокси между вашим клиентом и сервером, перенаправляющим запросы (в зависимости от того, как первый сервер вызывает второй сервер, может быть тайм-аутына втором сервере в конечном итоге сообщается как 502 на первом сервере).Я бы проверил журналы сервера обоих, чтобы увидеть, исчерпаны ли на сервере соединения обработчиков запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...