无法在GAE后台线程中使用JDO

nwa*_*ham 1 java google-app-engine exception jdo

我在Google App Engine中的Runnable对象上创建了一个后台线程,如下所示:

BackendService s = new BackendService();
thread = ThreadManager.createBackgroundThread(s);
thread.start();
Run Code Online (Sandbox Code Playgroud)

但是 - 在初始化时获取PersistenceManagerFactory,我喜欢这样:

private static final PersistenceManagerFactory pmfInstance = JDOHelper.getPersistenceManagerFactory("transactional");
Run Code Online (Sandbox Code Playgroud)

我得到一个类加载器异常:

Uncaught exception from servlet
com.google.apphosting.runtime.FatalError: A not-user-defined ClassLoader was set as the thread'scontextClassLoader: sun.misc.Launcher$AppClassLoader@1a8c4e7
at com.google.appengine.runtime.Request.process-f71d5e950ca508ff(Request.java)
at java.security.AccessController.doPrivileged(AccessController.java:34)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

小智 5

我有同样的问题(使用JPA.)似乎有效的解决方案是手动设置Runnable中的类加载器.

在调用对象:

private static Thread thread;
private static ClassLoader cl;
Run Code Online (Sandbox Code Playgroud)

在调用方法中:

...
cl = getClass().getClassLoader();
thread = ThreadManager.createBackgroundThread(...);
thread.start();
...
Run Code Online (Sandbox Code Playgroud)

在Runnable run()中:

thread.setContextClassLoader(cl);
...
Run Code Online (Sandbox Code Playgroud)