CXF的readEntity()获得“实体不可用”

时间:2017-11-16 21:07:03

标签: cxf

我正在处理一段使用CXF(3.1.2)

的代码

我间歇地看到这个错误:

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;
                    }

                }
            );

1 个答案:

答案 0 :(得分:0)

(我自己回答这个问题)

问题是我有并发进程尝试readEntity(),第一个进程消耗了输入流(或者甚至可能关闭了流),第二个进程要么被抛出{{1}或者得到一条空信息。以下是JavaDoc of javax.ws.rs.core.ResponseIllegalStateException扩展)所说的内容:

  

<强>抛出:

     

IllegalStateException - 如果实体不支持   输入流,响应已经关闭,或者是实体   输入流已经完全消耗并且尚未缓冲   事先消费。

所以为了解决这个问题,我改变了我的设计,不是缓存org.apache.cxf.jaxrs.impl.ResponseImpl对象,而是缓存Response调用结果的字符串消息。当响应回来时,调用将完成一次:

readEntity()

问题解决了。