CXF 的 readEntity() 获得了 "Entity is not available"
CXF's readEntity() got "Entity is not available"
我正在编写一段使用 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;
}
}
);
(我自己回答问题)
问题是我有并发进程试图 readEntity()
,第一个进程消耗了输入流(或者甚至可能关闭了流),第二个进程要么被抛出 IllegalStateException
或收到一条空消息。 JavaDoc of javax.ws.rs.core.Response
(org.apache.cxf.jaxrs.impl.ResponseImpl
扩展)是这样说的:
Throws:
IllegalStateException - if the entity is not backed by an
input stream, the response has been closed already, or if the entity
input stream has been fully consumed already and has not been buffered
prior consuming.
所以为了解决这个问题,我改变了我的设计来缓存不是 Response
对象而是 readEntity()
调用结果的字符串消息。当响应返回时,调用将只执行一次:
Response resp ...
String respStr = resp.readEntity(String.class);
问题就解决了。
我正在编写一段使用 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;
}
}
);
(我自己回答问题)
问题是我有并发进程试图 readEntity()
,第一个进程消耗了输入流(或者甚至可能关闭了流),第二个进程要么被抛出 IllegalStateException
或收到一条空消息。 JavaDoc of javax.ws.rs.core.Response
(org.apache.cxf.jaxrs.impl.ResponseImpl
扩展)是这样说的:
Throws:
IllegalStateException - if the entity is not backed by an input stream, the response has been closed already, or if the entity input stream has been fully consumed already and has not been buffered prior consuming.
所以为了解决这个问题,我改变了我的设计来缓存不是 Response
对象而是 readEntity()
调用结果的字符串消息。当响应返回时,调用将只执行一次:
Response resp ...
String respStr = resp.readEntity(String.class);
问题就解决了。