[英]Migrating an EAR application from AppEngine to Google Cloud SDK
[英]Connect Java Google AppEngine Local Standard Server to Cloud DB | appengine-api-1.0-sdk-1.9.84.jar | IntelliJ & Cloud Code
EDIT2:我设法克服了GlobalDatastoreConfig has already been set
错误。 我设法查明了在init
function 之前被调用的所有位置。它们在一些奇怪的文件中的 static 空间中。
我现在已将 ALL DatastoreServiceFactory.getDatastoreService()
指向我在名为Const.java
。
private static boolean hasInit = false;
public static DatastoreService getDatastoreService() {
if(!hasInit) {
try {
CloudDatastoreRemoteServiceConfig config = CloudDatastoreRemoteServiceConfig
.builder()
.appId(CloudDatastoreRemoteServiceConfig.AppId.create(CloudDatastoreRemoteServiceConfig.AppId.Location.US_CENTRAL, "gcp-project-id"))
.build();
CloudDatastoreRemoteServiceConfig.setConfig(config);
hasInit = true;
} catch (Exception ignore) {}
}
return DatastoreServiceFactory.getDatastoreService();
}
这在第一次初始化时不会返回任何错误。 但是,我现在收到一个新错误!
Dec 08, 2022 6:49:56 PM com.google.appengine.api.datastore.dev.LocalDatastoreService init
INFO: Local Datastore initialized:
Type: High Replication
Storage: C:\Users\user\dev\repo\Celbux\core\Funksi179_NSFAS_modules\classes\artifacts\Funksi179_NSFAS_modules_war_exploded\WEB-INF\appengine-generated\local_db.bin
Dec 08, 2022 6:49:56 PM com.google.appengine.api.datastore.dev.LocalDatastoreService load
INFO: Time to load datastore: 20 ms
2022-12-08 18:49:56.757:WARN:oejs.HttpChannel:qtp1681595665-26: handleException / java.io.IOException: com.google.apphosting.api.ApiProxy$CallNotFoundException: Can't make API call urlfetch.Fetch in a thread that is neither the original request thread nor a thread created by ThreadManager
2022-12-08 18:49:56.762:WARN:oejsh.ErrorHandler:qtp1681595665-26: Error page too large: 500 org.apache.jasper.JasperException: com.google.apphosting.api.ApiProxy$RPCFailedException: I/O error
完整的堆栈跟踪: https://pastebin.com/YQ2WvqzM
很确定第一个错误是从此行调用的:
DatastoreService ds = Const.getDatastoreService();
Key ConstantKey = KeyFactory.createKey("Constants", 1);
Entity Constants1 = ds.get(ConstantKey) // <-- This line.
EDIT1:我没有使用 Maven。这是我在WEB-INF/lib
中的.jar
appengine-api-1.0-sdk-1.9.84.jar
appengine-api-labs.jar
appengine-api-labs-1.9.76.jar
appengine-api-stubs-1.9.76.jar
appengine-gcs-client.jar
appengine-jsr107cache-1.9.76.jar
appengine-mapper.jar
appengine-testing-1.9.76.jar
appengine-tools-sdk-1.9.76.jar
charts4j-1.2.jar
guava-11.0.2.jar
javax.inject-1.jar
json-20190722.jar
原始问题:我工作的公司有一个用 Java 编写的遗留 GCP 代码库。此代码库使用appengine-api-1.0-sdk.jar
库。 在我们的 DatastoreService 初始化的第一时间运行此CloudDatastoreRemoteServiceConfig
代码时,它表示配置已经设置。
如果有人可以阐明如何通过localhost
将这种过时的技术连接到云,我将不胜感激!
web.xml
<filter>
<filter-name>NamespaceFilter</filter-name>
<filter-class>com.sintellec.funksi.Filterns</filter-class>
</filter>
<filter-mapping>
<filter-name>NamespaceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
代码
public class Filterns implements javax.servlet.Filter {
public void init(FilterConfig filterConfig) {
try {
CloudDatastoreRemoteServiceConfig config = CloudDatastoreRemoteServiceConfig
.builder()
.appId(CloudDatastoreRemoteServiceConfig.AppId.create(CloudDatastoreRemoteServiceConfig.AppId.Location.US_CENTRAL, "gcp-project-id"))
.build();
CloudDatastoreRemoteServiceConfig.setConfig(config);
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
} catch (Exception e) {
System.out.println(e);
return;
}
this.filterConfig = filterConfig;
}
}
我从这里得到了这个代码片段。
在想一些想法:
唯一的问题是我不知道从这里做什么,希望有人对这里的旧 Java 库有经验。
澄清; 我试图让这个过时的 GCP Java 代码库 ( appengine-api-1.0-sdk.jar
) 连接到云数据存储,而不是使用本地数据存储模拟器。 这样我就可以调试所有访问同一个云数据库的多个应用程序
很难说,特别是对于那么多的代码,我们只能猜测,但正如您所指出的,可能某些代码正在初始化您的 DataStore 配置,可能是 SDK 本身。 您可以尝试在CloudDatastoreRemoteServiceConfig
的setConfig
方法中设置断点并分析调用堆栈。
无论如何,人们认为您也可以尝试不执行代码中的初始化等操作 ,将客户端库的身份验证委托给应用程序默认凭据。
对于本地开发,您有两个选项可以配置,例如应用程序默认凭据。
一方面,您可以使用user credentials ,即,您可以使用gcloud
CLI 向具有与服务交互所需权限的用户进行 GCP 身份验证,发出以下命令:
gcloud auth application-default login
请不要忘记在您不再需要这些凭据时撤销它们:
gcloud auth application-default revoke
另一方面,您可以创建一个具有必要权限和相应服务帐户密钥的服务帐户,然后将该密钥(一个 881569990078588 文件)下载到您的本地文件系统。 有关特定于 DataStore 的说明,请参阅此内容。 然后,使用您的服务帐户密钥将环境变量GOOGLE_APPLICATION_CREDENTIALS
设置为下载文件的路径。
再次提醒一句:保管好下载的服务帐户密钥文件,切勿将其置于版本控制之下,因为拥有该文件的任何人都可以承担授予服务帐户的权限。
在 GCP 中运行时,您的代码应该可以正常工作,因为您可能会使用支持附加服务帐户的服务,这意味着应用程序默认凭据由 GCP 服务本身提供。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.