如何在Java中为Google云端点处理程序执行线程?

如何在Java中为Google云端点处理程序执行线程?,java,multithreading,google-app-engine,google-cloud-endpoints,Java,Multithreading,Google App Engine,Google Cloud Endpoints,我注意到我的应用程序中有一些奇怪的行为,闻起来像是缺少线程安全性。我正在努力复制它,但在此期间,我想确保我对包含端点处理程序的类如何从线程角度使用做出了正确的假设。发生的大部分事情对我来说都是不透明的,因为我不是第一个实例化类的人。为了说明这一点,端点中一定有一些黑魔法 我的假设 为进入我的应用程序的每个请求创建一个包含我的端点处理程序的类实例。基于这一假设,该类可以有非线程安全的对象供我的处理程序使用 我的恐惧 端点处理程序类的实例跨请求重用 那么,是哪一个?不管答案是什么,我认为消除应用程序

我注意到我的应用程序中有一些奇怪的行为,闻起来像是缺少线程安全性。我正在努力复制它,但在此期间,我想确保我对包含端点处理程序的类如何从线程角度使用做出了正确的假设。发生的大部分事情对我来说都是不透明的,因为我不是第一个实例化类的人。为了说明这一点,端点中一定有一些黑魔法

我的假设

为进入我的应用程序的每个请求创建一个包含我的端点处理程序的类实例。基于这一假设,该类可以有非线程安全的对象供我的处理程序使用

我的恐惧

端点处理程序类的实例跨请求重用

那么,是哪一个?不管答案是什么,我认为消除应用程序中的模糊性并假设最坏的情况对我来说是有意义的,因为我认为我无法控制端点的行为。在我的例子中,在构建包含端点处理程序的类时,我正在创建一个JDO/DataNucleus PersistenceManager(不是线程安全的)。我可能应该在每个处理程序中将其创建为本地,或者使用ThreadLocal


我也可以设计一个测试来证明其中一个。如果我这样做了,我会发回我自己问题的答案。

为什么您会为每个请求假设一个新实例?而且,出于好奇,您的应用程序在
appengine web.xml
中定义为线程安全吗?显然是因为我没有仔细考虑。在我写这篇文章时,我得出了一个内部结论,即我的假设是愚蠢的,但我还是发布了它以供确认,因为其他人可能会受益。是的,appengine-web.xml中将该应用程序定义为线程安全。我确实希望重用我的实例。我不能代表GAE,但在正常的servlet环境中,servlet实例(=端点类)是重用的:我想说的是,如果您在端点之前有一个过滤器,并在过滤器和端点中检查线程(通过使用Thread.currentThread().getName()),您会看到两个不同的线程。