Spring boot アプリケーションでフリーズが発生
Spring boot を使用したREST API のアプリケーションで、頻繁にハングが発生してしまいます。
プログラムの処理の流れとしては、
http://[URL]/sxx/sxx/hxx に対して、クライアントアプリから、20秒ごとにGETで常にリクエストを受信し続け、
http://[URL]/sxx/sxx/sxx に対してはPOSTを使用し、随時特定のタイミングでリクエストを受信しています。
その際、GETの処理を行っている最中(20秒ごとのリクエストを処理しているとき)に、
POSTの処理を行うと、プログラムがハングアップし応答しなくなってしまうことが
あります。
一度ハングアップすると、プログラムを再起動するまではリクエストを送信しても
延々と応答待ちの状態が続き、GETもPOSTによるリクエストも処理できなくなってしまいます。
ハングアップが発生した時点では、ログには何も表示されておらず、
Ctrl+Cでプログラムを強制終了した際にもエラーログには何も表示されませんでした。
スレッドダンプも行いましたが、特にデッドロックが発生している記載もありませんでした。
正常時とハングアップ発生時のスレッドダンプの結果に差異が一部あったため、
下記に記載させていただきます。
上記の症状について何かわかることがあれば、ご教示をいただきたいです。
長々と失礼しましたが、何卒お力添えいただければ幸いです。
発生している問題・エラーメッセージ
"https-jsse-nio-8443-exec-5" #23 daemon prio=5 os_prio=0 tid=0x0000000012ff9800 nid=0xcfc waiting on condition [0x000000001955d000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000eaf15770> (a java.util.concurrent.locks.ReentrantLock$NonfairSync) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199) at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209) at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285) at ch.qos.logback.core.OutputStreamAppender.writeBytes(OutputStreamAppender.java:197) at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:231) at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:102) at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84) at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51) at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270) at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257) at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421) at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383) at ch.qos.logback.classic.Logger.log(Logger.java:765) at org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog.debug(LogAdapter.java:445) at org.springframework.core.log.LogFormatUtils.traceDebug(LogFormatUtils.java:90) at org.springframework.web.servlet.DispatcherServlet.logRequest(DispatcherServlet.java:955) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:910) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) 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:53) 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.FormContentFilter.doFilterInternal(FormContentFilter.java:92) 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:200) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) - locked <0x00000000e0c97d08> (a org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper) 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)
該当のソースコード
java
1@RestController 2public class Controller { 3 4 @Autowired private JdbcTemplate jdbc; 5 6 @RequestMapping(value = "/sxx/sxx/sxx", 7 consumes = MediaType.APPLICATION_JSON_VALUE, 8 produces = MediaType.APPLICATION_JSON_VALUE) 9 public SxxResult state(@RequestBody RequestSxxsState req) { 10 11 SxxResult res = new SxxResult(); 12 res.setResult("success"); 13 14 return res; 15 } 16 17 @RequestMapping(value = "/sxx/sxx/hxx", 18 method = {RequestMethod.GET}, 19 produces = MediaType.APPLICATION_JSON_VALUE) 20 public SxxsState sxxState( @RequestParam("a_id") String a_id ) { 21 22 List<Map<String, Object>> a_status = jdbc.queryForList("SELECT * FROM a_status"); 23 24 String e_0xXX = (String) a_status.get(0).get("0xXX"); 25 String e_0xZZ = (String) a_status.get(0).get("0xZZ"); 26 String time = (String) a_status.get(0).get("time"); 27 28 SxxsState res = new SxxsState(); 29 30 res.a_id= a_id; 31 res.e_0xXX= e_0xXX; 32 res.e_0xZZ= e_0xZZ; 33 res.time = time; 34 35 return res; 36 } 37 38 @RequestMapping(value = "/auth/redirect") 39 public String auth() { 40 return "auth"; 41 } 42}
試したこと
・ハングアップ発生中に上記以外のパスに対してのリクエストが成功するかどうか試したところ、
正常にレスポンスが返却されました。
補足情報(FW/ツールのバージョンなど)
Java : 8
MySQL : 5.5
Spring boot : 2.1.4
あなたの回答
tips
プレビュー