我正在处理一段使用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 LoadingCache
(com.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 :(得分:0)
(我自己回答这个问题)
问题是我有并发进程尝试readEntity()
,第一个进程消耗了输入流(或者甚至可能关闭了流),第二个进程要么被抛出{{1}或者得到一条空信息。以下是JavaDoc of javax.ws.rs.core.Response
(IllegalStateException
扩展)所说的内容:
<强>抛出:强>
IllegalStateException - 如果实体不支持 输入流,响应已经关闭,或者是实体 输入流已经完全消耗并且尚未缓冲 事先消费。
所以为了解决这个问题,我改变了我的设计,不是缓存org.apache.cxf.jaxrs.impl.ResponseImpl
对象,而是缓存Response
调用结果的字符串消息。当响应回来时,调用将完成一次:
readEntity()
问题解决了。