Есть ли способ, чтобы запретить очередям задач Google App Engine (Java) выполнять обратный вызов туда, откуда он был вызван? - PullRequest
0 голосов
/ 23 марта 2011

Я в своем уме. У меня есть задача, вложенная в транзакцию. Задача отправляет клон входящих данных в другой сервис. Но когда задача завершается, по какой-то неизвестной причине, снова вызывается исходный обработчик, который запускает задачу, который, в свою очередь, запускает задачу и т. Д. В конце концов основной обработчик получает слишком много конфликтов в хранилище данных и возвращает 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

...