我遇到了一个似乎与memcache有关的错误。
java.lang.IllegalArgumentException: Key is incomplete.
at com.google.appengine.api.datastore.KeyFactory.keyToString(KeyFactory.java:164)
at com.googlecode.objectify.cache.KeyMemcacheService.stringify(KeyMemcacheService.java:62)
at com.googlecode.objectify.cache.KeyMemcacheService.putAll(KeyMemcacheService.java:91)
at com.googlecode.objectify.cache.EntityMemcache.empty(EntityMemcache.java:319)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService$5.trigger(CachingAsyncDatastoreService.java:445)
at com.googlecode.objectify.cache.TriggerFuture.isDone(TriggerFuture.java:89)
at com.googlecode.objectify.cache.TriggerFuture.get(TriggerFuture.java:104)
at com.googlecode.objectify.impl.ResultAdapter.now(ResultAdapter.java:34)
at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:22)
at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:10)
at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:22)
at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:10)
at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
我试图坚持的对象正在扩展以下内容,并且有 @Parent Key someclass;
public abstract class AbstractVO<T> implements iVO<T> {
private static final Logger log = Logger.getLogger(AbstractVO.class.getName());
@Id
private Long id;
@Index
private Date lastModified;
public Long getId() {
return id;
}
public Date getLastModified() {
return lastModified;
}
public void setId(Long id) {
this.id = id;
}
public void setLastModified(Date lastModified) {
this.lastModified = lastModified;
}
public Key<?> getKey() {
return Key.create(this);
}
@OnSave
public void onSaveFunction(){
setLastModified(new Date());
}
@SuppressWarnings("unchecked")
public T save(){
try {
ofy().save().entity(this).now();
} catch (IllegalArgumentException e){
log.log(Level.SEVERE, "boom, key was incomplete", e);
}
return (T) this;
}
public Result<Void> delete(){
return ofy().delete().entity(this);
}
@SuppressWarnings("unchecked")
public T refresh(){
if (getId() != null){
return (T) ofy().load().entity(this).now();
}
else {
return (T) this;
}
}
日志显示保存实体所需的数据是您期望的数据:
parent id:5813790675304448
parent key:ag5zfnRlY2gtZXNzZW5jZXJZCxIHQ29tcGFueRiAgIDAyK2fCAwLEghDYW1wYWlnbhiAgICA0pCXCwwLEgpBY3Rpb25UeXBlGICAgICS5-gJDAsSDFNlbGxlckFjdGlvbhiAgICAyvOpCgw
entity id: null
以前是否有人遇到此问题,我该如何解决?我已经编写了测试用例以尝试在我的开发服务器上重现,但它们都在通过。它似乎只是生产上的一个问题。
编辑:
我已经删除了受影响实体上的缓存,这导致实体节省了10秒钟(我猜这是超时?)和高争用使它爆炸..
答案 0 :(得分:0)
我认为我已经确定了问题,这只是争论..我已经重写了我的大部分应用程序来验证 - 我现在正在迁移中间并且会让你知道