У меня есть весенний веб-проект, который предоставляет спокойный сервис через 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)