2012-06-07 3 views
2

У меня есть отложенное задание формата электронной почты тела в HTML делать в UrlFetch моей собственной области применения:URL-адрес В моем приложении для домена всегда запускается новый экземпляр. Как этого избежать?

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

Где пройти несколько Params в сервлет formatEmail, чтобы сделать прекрасный HTML электронную почту .. :) Этот код отлично работает, создает новую задачу push и успешно отправляет сообщение.

Проблема заключается в том, что эта задача всегда, в 100% случаев, создает новый экземпляр, даже без какого-либо доступа пользователя, чтобы сделать это сложной задачей и завершением экземпляра в конце кода.

Как этого избежать?

Если я делаю UrlFetch для внешнего домена вместо моего собственного домена, обычно GAE не создает новый экземпляр для этого ... не странно?

ответ

1

Время выполнения Java не многопоточно, поэтому каждый экземпляр может обрабатывать только один запрос за раз. Когда ваше приложение делает запрос к себе, как правило, не будет свободного экземпляра, доступного для обслуживания нового запроса - вызывающий абонент уже занимает это пространство.

Вы можете использовать запросы на разогрев и параметры idle экземпляров, чтобы убедиться, что для обработки вашего запроса на форматирование есть дополнительный экземпляр, но кажется, что вы можете вызвать код форматирования непосредственно в исходном запросе вместо того, чтобы делать запрос HTTP самому себе.

ОБНОВЛЕНИЕ: Как указывает Ник, это только верно by default. Вы установили <threadsafe>true</threadsafe>?

+2

Это неверно. Время выполнения Java поддерживает потоки. –

+0

My threadsafe имеет значение false, потому что я не уверен, что все мое приложение является потокобезопасным, пока ... и мой код форматирования слишком длинный и жесткий для поддержания в кодировке типа out.print (''); ' но я ценю ваше объяснение .. спасибо! – dipold

+0

Я забыл сказать, что formatEmail является контроллером файла jsp – dipold