2

自分のアプリケーションドメインに対してUrlFetchを実行して、本文の電子メールをHTMLでフォーマットするための延期されたタスクがあります。

//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));

いくつかのパラメータをサーブレットformatEmailに渡して、素敵なHTMLメールを作成します。:)このコードは正常に機能し、新しいプッシュタスクを作成し、メールを正常に送信します。

問題は、このタスクが常に100%の場合、ユーザーアクセスがなくても新しいインスタンスを作成して、この困難なタスクを作成し、コードの最後でインスタンスをシャットダウンすることです。

これを回避する方法は?

自分のドメインではなく外部ドメインにUrlFetchを作成した場合、通常、GAEはそのための新しいインスタンスを作成しません。

4

1 に答える 1

1

Javaランタイムはマルチスレッドではないため、各インスタンスは一度に1つのリクエストしか処理できません。アプリケーションがそれ自体にリクエストを行う場合、通常、新しいリクエストを処理するために利用できる無料のインスタンスはありません。呼び出し元はすでにそのスペースを占有しています。

ウォームアップリクエストとアイドルインスタンス設定を使用して、フォーマットリクエストを処理するための追加のインスタンスがあることを確認できますが、HTTPリクエストを自分で作成する代わりに、元のリクエストでフォーマットコードを直接呼び出すことができるようです。

更新:ニックが指摘するように、これはデフォルトでのみ当てはまります。設定しました<threadsafe>true</threadsafe>か?

于 2012-06-07T23:04:36.483 に答える