Google App Engine のアプリケーションで重大なエラーに直面しています。
私がこれを行うとき:
CompanyUser.validate("email", email);
CompanyUser.validate("password", password, password);
Validator.checkValidation();
CompanyUser user;
try {
user = company.getUserByEmail(email);
//(user.getPassword() == "") se o usuário administrador resetar a senha, alterar o e-mail ou cadastrar um novo usuário
//(user.isWaitingConfirmation()) nos mesmos casos acima e mais quando o usuário alterar seu próprio e-mail ou o usuário administrador se cadastrar (cadastro na home do site)
if(Tools.isEmptyString(user.getPassword()) || user.isWaitingConfirmation()) {
if(user.getLastAccessDate() == null) //Se for usuário novo
throw new AuthenticationException("Seu usuário encontra-se bloqueado.<br />Para ativar seu acesso ao portal, acesse seu e-mail e siga as instruções.");
else
throw new AuthenticationException("Seu usuário encontra-se bloqueado.<br />Para reativar seu acesso ao portal, acesse seu e-mail e siga as instruções.");
}
byte[] bDigest = user.getPasswordBytes();
byte[] bSalt = user.getPasswordSaltBytes();
byte[] proposedDigest = user.getHash(password, bSalt);
if (Arrays.equals(proposedDigest, bDigest)) {
try{
user.setLastAccessDate(Tools.getCurrentTime());
company.saveDetached();
} catch (DeadlineExceededException e) {
Tools.sendMail("ERRO Severidade média: Não esta salvando ultimo acesso de Usuario", "ERRO: Não esta salvando ultimo acesso do Usuario " + user.getEmail() + " da empresa " + user.getCompany().getName()+ "" +
"Objeto esta com transação aberta.", Tools.getChaintSupportEmail());
}
return user;
}
} catch (ObjectNotFoundException e) {
user = null;
}
throw new AuthenticationException("Usuário/Senha não conferem");
public Object saveDetached() throws InvalidFieldsValueException {
if(IdModel.getErrorList().isEmpty() == false) {
Vector<ValidatorError> el = IdModel.getErrorList();
Validator.clearError();
throw new InvalidFieldsValueException(el);
}
return PersistenceManager.saveDetached(this, true);
}
public static Object saveDetached(Object object, boolean detach) {
Object ob = null;
String msg ="";
javax.jdo.PersistenceManager pm = getPM();
pm.setDetachAllOnCommit(detach);
Transaction t = pm.currentTransaction();
try {
t.begin();
ob = pm.makePersistent(object);
t.commit();
} catch (Exception e) {
String[] fieldNames = NucleusJDOHelper.getDetachedObjectDirtyFields(object, pm);
for(String s:fieldNames) {
msg = msg.concat(s+";\n");
}
} finally {
String[] fieldNames;
if (t.isActive()) {
fieldNames = NucleusJDOHelper.getDetachedObjectLoadedFields(object, pm);
msg = msg+"NucleusJDOHelper.getDetachedObjectLoadedFields";
for (String s : fieldNames) {
msg = msg.concat(s + ";\n");
}
Tools.getLogger().warning(msg);
t.rollback();
}
pm.close();
}
return ob;
}
これが起こります:
201.86.195.206 - - [24/Sep/2012:14:24:48 -0700] "GET / HTTP/1.1" 500 0 - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML、Gecko など) Chrome/21.0.1180.89 Safari/537.1" "tci.chainit.com.br" ms=60020 cpu_ms=22858 exit_code=104 インスタンス=00c61b117c6e51b4aec6d2e4089516b479c2a0 E2012-09-24 18:24:47.974 操作 org.transaction.nucleusリソースでロールバックが失敗しました: org.datanucleus.store.appengine.DatastoreXAResource@2d659、エラー コード UNKNOWN およびトランザクション: [DataNucleus トランザクション、ID=Xid= W2012-09-24 18:24:48.375 / com.google.apphosting のエラー。 runtime.HardDeadlineExceededError: この要求 (b08d8999601781ee) は 2012/09/24 21:23:48.426 UTC で開始され、2012/09/24 21:24:48.373 UTC でまだ実行されていました。java.util.concurrent.locks の sun.misc.Unsafe.park(Native Method) で。run(TraceContext.java:459) で com.google.tracing.TraceContext.runInContext(TraceContext.java:701) で com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:336) で com.google.tracing .TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:328) com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:456) com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java) :251) java.lang.Thread.run(Thread.java:679) C2012-09-24 18:24:48.376 サーブレット com.google.apphosting.runtime.HardDeadlineExceededError からのキャッチされない例外: この要求 (b08d8999601781ee) は 2012 年に開始されました/09/24 21:23:48.426 UTC であり、2012/09/24 21:24:48.373 UTC でまだ実行中でした。java.util.concurrent.locks.LockSupport の sun.misc.Unsafe.park(ネイティブ メソッド) で。
この要求を処理するプロセスで問題が発生したため、終了しました。これにより、アプリケーションへの次のリクエストに新しいプロセスが使用される可能性があります。このメッセージが頻繁に表示される場合は、アプリケーションの初期化中に例外がスローされている可能性があります。(エラーコード 104)
私には、各リクエストが終了しなければならない60秒以内にロールバック操作が終了せず、ロールバック操作がキャンセルされたようです。このようにして、オブジェクトは書き込みができない状態で終了します。
ユーザーオブジェクトがこの「変更不可能な」状態で終了し、それ自体では修正できず、Datanucleous の JDO では修正できないため、この問題は非常に深刻に思えます。