gpt4 book ai didi

java - Google App Engine 中请求线程之间的环境共享

转载 作者:行者123 更新时间:2023-12-05 08:04:52 27 4
gpt4 key购买 nike

我注意到,当我使用 GAE 提供的请求线程工厂创建新线程时,新线程具有相同 Environment作为父线程。 (当前环境的identityHashCode在两个线程中相同。)

一方面,这很好,因为新创建的线程从与父线程相同的上下文开始。问题是环境不是一成不变的。它包含用于命名空间处理的“.currentNamespace”属性。如果其中一个线程更改了当前命名空间,它将应用于所有线程,这显然不是我想要的。

我解决这个问题的想法是创建一个自己的环境实现,当创建一个新线程时,我将当前环境的内容复制到这个新环境中,并将这个环境设置为新线程上的当前环境。因此,新线程从相同的上下文开始,但稍后可以独立更改。

这个解决方案在初始测试期间有效,但后来我遇到了问题

Caused by: java.lang.ClassCastException: MyEnvironmentImplementation cannot be cast to com.google.apphosting.runtime.ApiProxyImpl$EnvironmentImpl
at com.google.apphosting.runtime.ApiProxyImpl.log(ApiProxyImpl.java:67)

我无权访问 com.google.apphosting.runtime.ApiProxyImpl 的代码,但很明显,此方法试图在不检查类型的情况下将其接收到的接口(interface)转换为自己的实现类.

我觉得这很奇怪,因为 ApiProxy 中有一个 void setEnvironmentFactory(ApiProxy.EnvironmentFactory factory),所以预计有人可能会使用不同的 Environment 实现界面比默认界面。

有没有其他方法可以在不同的请求线程中使用不同的命名空间?
这种未经检查的转换是否被视为错误,或者使用我自己的环境实现从根本上是错误的?

我在 1.9.84 的 java sdk 中使用 App Engine 标准。

编辑:实际上记录了“这不应该从用户代码中使用”。在ApiProxy.setEnvironmentForCurrentThread() 和 ApiProxy.setEnvironmentFactory() 方法。因此,我建议的解决方法预计不会奏效。你也不应该尝试类似的事情。

最佳答案

无需使用 Google API 线程。不要让 Google API 给您带来麻烦。正如我在此处描述的那样,您自己在浏览器之外执行此操作。

编写一个程序,对浏览器进行子类化,并对打开的每个窗口进行子类化。然后在每个页面上运行一个 javascript,将您的结果保存到地址栏,以便以后轻松收集。然后从地址栏中收集该信息,然后将之前的(位于地址栏中)放回其中,这样它就会被视为与之前相同。

如果您想在不同的网页中使用该数据,请通过单独的程序将其放在那里。

理论上,每个打开的浏览器窗口都可以运行一个单独的 google api 进程。

通过您的程序分别对所有浏览器窗口进行子类化,让您的程序在它们之间共享信息,而不会混淆 google api。

像这样:

编写一个程序(在 VB6 sp5 中,我在几年前做过。永远不要使用任何更高版本的 Visual Studio。在 C++11 中,这应该可以。)。

在此示例中使用 FireFox 作为浏览器。

(1) 启动您的程序并子类化 FireFox。

(2) 让您的程序告诉 Firefox 打开一个新窗口(可能需要将其设为 FireFox 的“新标签”,也可能不需要)。

(3) 告诉您的程序获取新打开窗口的预句柄。快速执行此操作并继续尝试(如果操作系统过载,最多 30 秒)直到获得预句柄,然后将新窗口的句柄分配给该新窗口或新选项卡。

(4) 使用新句柄并将 javascript 发送到地址栏(减去“j”),这意味着您将整个“avascript...”发送到该地址栏,然后添加前面的“j”因为如果 FireFox 检测到您在地址栏中放置了包含整个单词“javascript”的任何命令,它会阻止您执行某些操作(如果我没记错的话)。

(5) 运行该 javascript 从每个页面获取或将您的更改放入每个页面。

(6) 浏览器中运行 javascript 的网页完成了部分工作。

(7) 无需使用 Google API 线程。

关于java - Google App Engine 中请求线程之间的环境共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67176100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com