

JavaEE（Wildfly10.1.0）でアプリケーションを開発しています。  
JAX-RSで作ったWebAPIの呼び出し時に、たまに後述の例外が発生するのですが、解決方法が分かりません。  
発生するWebAPIも様々で、APIの中身の作りが問題というわけではないように思いますが・・・  
何となく、複数のWebAPIを同時にいくつも呼んだ時に起きやすいように思います。

**↓追記**  
直前に15秒以上かかる別のHTTPリクエストを投げていると、起きるようです。  
同じクライアントからの（もしくは同一セッションでの）HTTPリクエストは、並列処理できないのですかね？  
**↑追記ここまで**

  * そもそもこの例外の正体は何なのか？  
何がタイムアウトしていることを示している？

  * なにが原因で発生し得るのか？

  * どうやったら解決できるのか？  
せめてタイムアウト時間を15秒から伸ばせないか？  
（デッドロックのようなことになっていたら、その対策は無意味だが・・・一応試したい）

スタックトレース：

[code]

    14:38:01,380 ERROR [io.undertow.request] (default task-62) UT005023: Exception handling request to [WebAPIのURL]: org.infinispan.util.concurrent.TimeoutException: ISPN000299: Unable to acquire lock after 15 seconds for key SessionCreationMetaDataKey(VLmo-LCKzVeaftNEv_Dh0dKbm2mFC24T7kYIQNtC) and requestor GlobalTransaction:<null>:260:local. Lock is held by GlobalTransaction:<null>:258:local
        at org.infinispan.util.concurrent.locks.impl.DefaultLockManager$KeyAwareExtendedLockPromise.lock(DefaultLockManager.java:238)
        at org.infinispan.interceptors.locking.AbstractLockingInterceptor.lockAndRecord(AbstractLockingInterceptor.java:193)
        at org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.checkPendingAndLockKey(AbstractTxLockingInterceptor.java:193)
        at org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.lockOrRegisterBackupLock(AbstractTxLockingInterceptor.java:116)
        at org.infinispan.interceptors.locking.PessimisticLockingInterceptor.visitDataReadCommand(PessimisticLockingInterceptor.java:71)
        at org.infinispan.interceptors.locking.AbstractLockingInterceptor.visitGetKeyValueCommand(AbstractLockingInterceptor.java:80)
        at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:43)
        at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
        at org.infinispan.interceptors.TxInterceptor.enlistReadAndInvokeNext(TxInterceptor.java:346)
        at org.infinispan.interceptors.TxInterceptor.visitGetKeyValueCommand(TxInterceptor.java:331)
        at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:43)
        at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
        at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:114)
        at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:83)
        at org.infinispan.commands.AbstractVisitor.visitGetKeyValueCommand(AbstractVisitor.java:85)
        at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:43)
        at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:335)
        at org.infinispan.cache.impl.CacheImpl.get(CacheImpl.java:411)
        at org.infinispan.cache.impl.DecoratedCache.get(DecoratedCache.java:443)
        at org.infinispan.cache.impl.AbstractDelegatingCache.get(AbstractDelegatingCache.java:286)
        at org.wildfly.clustering.web.infinispan.session.InfinispanSessionMetaDataFactory.getValue(InfinispanSessionMetaDataFactory.java:70)
        at org.wildfly.clustering.web.infinispan.session.InfinispanSessionMetaDataFactory.findValue(InfinispanSessionMetaDataFactory.java:60)
        at org.wildfly.clustering.web.infinispan.session.InfinispanSessionMetaDataFactory.findValue(InfinispanSessionMetaDataFactory.java:36)
        at org.wildfly.clustering.web.infinispan.session.InfinispanSessionFactory.findValue(InfinispanSessionFactory.java:59)
        at org.wildfly.clustering.web.infinispan.session.InfinispanSessionFactory.findValue(InfinispanSessionFactory.java:38)
        at org.wildfly.clustering.web.infinispan.session.InfinispanSessionManager.findSession(InfinispanSessionManager.java:233)
        at org.wildfly.clustering.web.undertow.session.DistributableSessionManager.getSession(DistributableSessionManager.java:148)
        at io.undertow.servlet.spec.ServletContextImpl.getSession(ServletContextImpl.java:772)
        at io.undertow.servlet.spec.HttpServletRequestImpl.getSession(HttpServletRequestImpl.java:370)
        at org.jboss.weld.servlet.SessionHolder.requestInitialized(SessionHolder.java:47)
        at org.jboss.weld.servlet.HttpContextLifecycle.requestInitialized(HttpContextLifecycle.java:234)
        at org.jboss.weld.servlet.WeldInitialListener.requestInitialized(WeldInitialListener.java:152)
        at io.undertow.servlet.core.ApplicationListeners.requestInitialized(ApplicationListeners.java:246)
        at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:291)
        at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
        at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
        at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
        at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
        at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
        at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
        at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
        at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
        at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
        at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
        at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
        at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
        at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
        at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
        at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
        at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:805)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
    
[/code]


CC BY-SA 3.0
2018-01-23T05:57:42.913
41146
2018-01-27T12:02:49.733
2018-01-27T05:37:49.460
8078
8078
question
java-ee jax-rs
org.infinispan.util.concurrent.TimeoutExceptionとは何か？


※明確な回答ではなく、推測も含んでいますが、解決の糸口になるかもしれないので、ここに回答します。

> そもそもこの例外の正体は何なのか？  
>  何がタイムアウトしていることを示している？

[TimeoutException.java](https://github.com/infinispan/infinispan/blob/a535b9623504bc5ec88584130065c89f1f9f357e/core/src/main/java/org/infinispan/util/concurrent/TimeoutException.java)を見ると、次のように書いてあります。

> Thrown when a timeout occurred. used by operations with timeouts, e.g. lock
> acquisition, or waiting for responses from all members.

スタックトレースの呼び出し元をたどると、`HttpServletRequestImpl.getSession()`があり、WildFlyの`InfinispanSessionManager`がキャッシュからセッションを取得しようとしています。Infinispanはセッションレプリケーションのためのキャッシュの目的で使われているのだと思いますが、キャッシュからセッションを取得するためのロックが開放されずタイムアウトしたのかもしれません。

> なにが原因で発生し得るのか？

この問題が関係しているかもしれません。

[Problem with infinispan, Unable to acquire lock after 15 seconds for key
](https://issues.jboss.org/browse/WFLY-6696)

クラスタ構成で、秒間300リクエストあると、この問題が発生するようです。

> どうやったら解決できるのか？  
>  せめてタイムアウト時間を15秒から伸ばせないか？  
>  （デッドロックのようなことになっていたら、その対策は無意味だが・・・一応試したい）

上記の問題は、Fix VersionがNoneとなっているので、未解決のようなので、回避策しかないかもしれません。

前述のJIRAのページや次のページも参考になるかもしれません。

<https://developer.jboss.org/thread/243458?tstart=0>

少し調べて見ましたが、調査に時間がかりそうなので、ここまでの回答とします。


CC BY-SA 3.0
2018-01-27T12:02:49.733
41244
2018-01-27T12:02:49.733
21092
41146
answer