Ajax-вызов (с использованием jquery) больше не получает ответов через 5 минут - PullRequest
0 голосов
/ 03 апреля 2012

На самом деле у меня есть приложение JavaScript (jQuery), которое отправляет запрос в функцию Java, которая должна отправлять данные (в случае успеха) в мою функцию ajax.
В случае успеха я продолжаю свое заявление; в случае ошибки я прекращаю свои процедуры и отображаю сообщение об ошибке пользователю.

Но когда Java-коду требуется более 5 минут для отправки ответа на мой Ajax-вызов, этот (ajax-код) больше не (работает / отвечает / идет /) не получает никакого ответа ...

Я попытался установить ограничение времени ожидания до 600000 ms (то есть 10 минут), но у меня все еще возникает та же проблема (и у меня нет сообщений об ошибках или выходных данных, которые могли бы мне помочь).

Так что, если у кого-то есть представление об источнике этой проблемы, я был бы благодарен.

Вот фрагмент кода, если он может сделать его более понятным:

JSP

$(document).ready(function() {
    /*  performing some layout changes  */

    //
    preValidationDisplay();
}      

function preValidationDisplay() {
    /*  performing some layout changes  */

    setTimeout("getValidationResult()", 500);    
}


function checkReadLogFile() {
    $.ajax({
            url: logFileUrl,
            cache: false,
            success: function(result)
            {                   
                $("#progressBarToResize").width( 
                    '' + parseFloat(result.trim()) + '%' );
            }
        });
}


function getValidationResult() 
{
    var timer = setInterval("checkReadLogFile()", 1000); 


    $.ajax({
        url: '<s:url value="doValidation"/>',
        type: "GET",
        cache: false,
        dataType: "json",
        async: true,
        //timeout : 600000,
        success: function(result, status)
        {
            // Do something
        },
        error: function(jqXHR, status, errorStr){
            // Do something
        }
    });
}

Java

@RequestMapping(value = "/doValidation", method = RequestMethod.GET)
public String processValidationResults(HttpServletRequest request, HttpServletResponse response,
        @RequestHeader("Connection") String conn) {
    ValidationResult validationResult = null;
    JSONObject resultJson = new JSONObject();

    HttpSession session = request.getSession();
    JSONObject progressMap = (JSONObject) session.getAttribute("progressMap");
    String uploadedFilePath = progressMap.getString("filePath");
    String realMimeType = progressMap.getString("realMimeType");
    long fileSize = progressMap.getLong("fileSize");
    String ctxPath = request.getContextPath();

    // INVOKE the VALIDATION ENGINE
    try {
        validationResult = validationEngineService.getValidationResult(uploadedFilePath, ctxPath);
        resultJson = JSONObject.fromObject(validationResult);
    } catch (Exception e) {
        validationResult = null;
        resultJson.put("errorMsg", e.toString());
    }

    try {
        response.getWriter().print(resultJson);
        response.flushBuffer();
    } catch (Exception e) {
    }

    return null;
}

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Когда вы работаете с HTTP, никогда не ожидайте, что соединение займет больше полминуты.

Либо используйте WebSockets или Comet (длинный опрос).

Видите, есть многостороны, которые могут решить прервать ваше соединение:

  • веб-браузер, брандмауэр / маршрутизатор / isp, веб-сервер (например, Apache), язык сценариев сервера (например, PHP)

Единственный раз, когда я отключаю это на стороне PHP, это когда я хочу, чтобы PHP продолжал работать даже после того, как пользователь остановил соединение (что, кстати, я включил еще один параметр).

0 голосов
/ 03 апреля 2012

Без некоторого кода я не уверен, смогу ли я чем-нибудь помочь, но вы пробовали проверить, какое событие вызывает вызов ajax?Однажды я сделал глупую ошибку, отправив ajax-запрос на keydown. Позже я обнаружил, что вместо keydown мне нужно было использовать keyup, так как это событие сработало, когда значение текстового поля установлено на недавно введенный текст + клавиша.Таким образом, вы можете попробовать keyup или изменить событие в jQuery.Если это на локальном хосте, это нехороший признак .... сначала определите, что вызывает проблему, интерфейс или бэкэнд.

Что нужно сделать: 1) Изменить тип события в jQuery

$("#elem").live("keyup",function() {//send req});

2) Проверьте журнал apache.Если вы используете Ubuntu или что-то подобное, вы можете перейти в /var/log/apache2/error.log

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...