2017-11-16 12 views
0

「エンティティが利用できない」しまった私はCXFを使用するコードの一部(3.1.2)CXFのreadEntity()

に取り組んでいます私は断続的にこのエラーを見ています:

java.lang.IllegalStateException: Entity is not available 
at org.apache.cxf.jaxrs.impl.ResponseImpl.checkEntityIsClosed(ResponseImpl.java:481) 
at org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:333) 
at org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity(ResponseImpl.java:320) 
at org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity(ResponseImpl.java:310) 

向上させるにはパフォーマンスは、ResponseオブジェクトはGoogle Guava LoadingCachecom.google.common.cache.LoadingCache)によって保持されます。オブジェクトがキャッシュに数分間置かれた後、このエラーが発生するようです。 Responseオブジェクトが無効なため が数分後に存在する可能性がありますか?

private static LoadingCache<String, Response> cachedLdapRespMap 
    = CacheBuilder.newBuilder() 
     .maximumSize(Constants.LDAP_RESP_CACHE_SIZE) 
     .expireAfterWrite(Constants.LDAP_RESP_CACHE_KEEP_ALIVE_MINUTE 
          , TimeUnit.MINUTES) 
     .build(
       new CacheLoader<String, Response>() { 

        @Override 
        public Response load(String uid) 
          throws Exception { 
         Response res = makeLdapRequest(uid); 
         return res; 
        } 

       } 
      ); 

答えて

0

(私は質問を自分自身に答える)

問題は、私はreadEntity()に試みた並行プロセスを持っているということでした、最初のプロセスは、入力ストリームを消費する(あるいはストリームを閉じている場合があります)、および2番目のプロセスはIllegalStateExceptionにスローされるか、空のメッセージが表示されます。エンティティが 入力ストリームによってバックアップされていない場合、応答はすでに閉鎖されている場合、または -

IllegalStateExceptionが:

例外:ここJavaDoc of javax.ws.rs.core.Responseは(org.apache.cxf.jaxrs.impl.ResponseImplが延びる)言っていることですエンティティ 入力ストリームはすでに完全に消費されており、バッファされていません。 が先に消費されました。だから、問題を修正する

は、私がいないResponseオブジェクトではなくreadEntity()呼び出しの結果である文字列メッセージをキャッシュするために私のデザインを変更しました。返答が返ってくると、呼び出しは1回だけ実行されます。

Response resp ... 
String respStr = resp.readEntity(String.class); 

この問題は解決されました。