Я в своем уме. У меня есть задача, вложенная в транзакцию. Задача отправляет клон входящих данных в другой сервис. Но когда задача завершается, по какой-то неизвестной причине, снова вызывается исходный обработчик, который запускает задачу, который, в свою очередь, запускает задачу и т. Д. В конце концов основной обработчик получает слишком много конфликтов в хранилище данных и возвращает 500 я думаю, это трудно просеять через страницы сгенерированных журналов). Я обеспокоен тем, что другой сервис работает в Azure и, вероятно, требует больших затрат. Задача 1) не вызывает явного вызова обработчика, который его вызвал, и 2) явно возвращает 200 ok, даже если что-то идет не так.
Почему он так себя ведет? Я прочитал все документы, не упоминая об обратном вызове, если я что-то пропустил. Мой логин хороший, задача не вызывается в цикле или что-то еще, что дает?
txn = em.getTransaction();
txn.begin();
String udata = URLEncoder.encode(Data, "UTF-8");
TaskOptions ops = TaskOptions.Builder.withUrl("/syncazure").
param("Email", user)
.param("ticket",ticket)
.param("ContactData", udata);
Queue q = QueueFactory.getQueue("myqueue");
q.add(ops);
//do some other stuff.......
txn.commit();
//and the task itself....
String email = req.getParameter("Email");
String ticket = req.getParameter("ticket");
String data = req.getParameter("ContactData");
String tries = req.getParameter("X-AppEngine-TaskRetryCount");
int t=0;
try{
t = Integer.parseInt(tries);
}catch(Exception exo){return;}
if(t>0)
return;
log.warning(email);
log.warning(ticket);
log.warning(data);
InputStream is=null;
InputStreamReader ireader=null;
BufferedReader reader=null;
HttpURLConnection connection = null;
OutputStreamWriter writer =null;
try{
String u = "http://contoso.cloudapp.net/sync";
URL url = new URL(u);
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
writer = new OutputStreamWriter(connection.getOutputStream());
writer.write("Email=" + email + "&ticket=" + ticket +"&ContactData=" + data);
writer.close();
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
log.warning("Responded 200 OK");
ireader = new InputStreamReader(connection.getInputStream());
reader = new BufferedReader(ireader);
StringBuilder sb = new StringBuilder();
int v =0;
while((v = reader.read())!=-1){
sb.append(v);
}
// nothing to do with response...
} else {
log.warning("Error Status....");
}
}catch(Exception e){e.printStackTrace();}
finally{
if(is!=null)
is.close();
if(ireader!=null)
ireader.close();
if(reader!=null)
reader.close();
}
resp.setStatus(200);
}
Должен ли я сделать это по-другому? Это ожидаемое поведение?
Я выяснил, что он делает из журналов, основной обработчик не работает из-за одновременной модификации ... что, и у меня есть около 1000 запросов как к обработчику задач, так и к основному обработчику, ошибки в основном - около 30-40 % в основном. Iv остановил задачу, чтобы фактически сделать что-нибудь с заголовком повторных попыток, но все еще не циклически.
Спасибо
Joshua