2

我有一项延迟任务来格式化 HTML 中的正文电子邮件,对我自己的应用程序域执行 UrlFetch:

//Format body email in HTML
final Charset UTF8_CHARSET = Charset.forName("UTF-8");
final String FORMAT_EMAIL = "http://www." + NamespaceManager.getGoogleAppsNamespace() + "/email/formatEmail";

URL url = new URL(FORMAT_EMAIL);
HTTPRequest req = new HTTPRequest(url, HTTPMethod.POST, FetchOptions.Builder.withDeadline(60.0));
req.setPayload(Utils.getPostData(map, "UTF-8").getBytes());
HTTPResponse resp = urlFetchService.fetch(req);
if (resp.getResponseCode() == HttpURLConnection.HTTP_OK)
    bodyMessage = new String(resp.getContent(), UTF8_CHARSET);
//here create new task to send email
SendEmail sendEmail = new SendEmail(emailTO, nameTO, emailREPLYTO, nameREPLYTO, subject, bodyMessage);
queue.add(TaskOptions.Builder.withPayload(sendEmail));

我将一些参数传递给 servlet formatEmail 以制作一封可爱的 HTML 电子邮件。.. :) 此代码工作正常,创建一个新的推送任务,并成功发送电子邮件。

问题是这个任务总是 100% 的时间创建一个新实例,即使没有任何用户访问,以使这个艰巨的任务和实例在代码结束时关闭。

如何避免这种情况?

如果我对外部域而不是我自己的域进行 UrlFetch,通常 GAE 不会为此创建新实例.... 不奇怪吗?

4

1 回答 1

1

Java 运行时不是多线程的,因此每个实例一次只能处理一个请求。当您的应用程序向自身发出请求时,通常不会有可用的空闲实例来为新请求提供服务——调用者已经占用了该空间。

您可以使用预热请求和空闲实例设置来确保有一个额外的实例来处理您的格式化请求,但您似乎可以直接在原始请求中调用格式化代码,而不是向自己发出 HTTP 请求。

更新:正如尼克指出的那样,这仅在默认情况下是正确的。你定了<threadsafe>true</threadsafe>吗?

于 2012-06-07T23:04:36.483 回答