Приложение GWT зависает из-за внутреннего бесконечного цикла

Я запускаю приложение GWT, используя GWT 2.5.1 и Ext GWT v2.2.4 на Eclipse Juno. Java 6 (32-разрядная), и я ничего не могу изменить.

Недавно мне передали это приложение, которое отлично работает на другом компьютере. После запуска приложения (Выполнить > Приложение GWT) я продолжаю входить в свое приложение, мой код выполняется нормально, но затем мое приложение зависает. Я провел отладку и обнаружил, что приложения входят в бесконечный цикл в этом внутреннем методе GWT (т.е. в классе com.google.gwt.dev.shell.BrowserChannelServer):

public void reactToMessages(SessionHandlerServer handler) {
    do {
      try {
        getStreamToOtherSide().flush();
        MessageType messageType = Message.readMessageType(
            getStreamFromOtherSide());
        switch (messageType) {
          case FREE_VALUE:
            final FreeMessage freeMsg = FreeMessage.receive(this);
            handler.freeValue(this, freeMsg.getIds());
            break;
          case INVOKE: //<<<< Keeps getting into this block
            InvokeOnServerMessage imsg = InvokeOnServerMessage.receive(this);
            ExceptionOrReturnValue result = handler.invoke(this, imsg.getThis(),
                imsg.getMethodDispatchId(), imsg.getArgs());
            sendFreedValues();
            ReturnMessage.send(this, result);
            break;
          case INVOKE_SPECIAL:
            handleInvokeSpecial(handler);
            break;
          case QUIT:
            return;
          default:
            throw new RemoteDeathError(new BrowserChannelException(
                "Invalid message type " + messageType));
        }
      } catch (IOException e) {
        throw new RemoteDeathError(e);
      } catch (BrowserChannelException e) {
        throw new RemoteDeathError(e);
      }
    } while (true);
}

messageType всегда INVOKE, а поскольку условие while true, цикл никогда не заканчивается. Таким образом, выполнение застревает в этом стеке:

Daemon Thread [Code server for av.mymodule from Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0 on http://127.0.0.1:8889/mymodule.html?gwt.codesvr=127.0.0.1:9997 @ tsb2t8vtLUT/vrj#] (Suspended)
            BrowserChannelServer.reactToMessages(BrowserChannelServer$SessionHandlerServer) line: 292      
            BrowserChannelServer.processConnection() line: 547  
            BrowserChannelServer.run() line: 364  
            Thread.run() line: 662  

Я чистил проект, удалял кэш-файлы, tmp-файлы, много раз перекомпилировал, пробовал старую версию 2.4.0, но не могу попробовать 2.6, потому что мне понадобится java 7, которую я не могу установить в данный момент. Пробовал хром и фаерфокс, результат тот же. После некоторого поиска я нашел несколько советов, что мне не следует увеличивать масштаб с помощью браузера, однако я этого не делаю.

Подскажите пожалуйста в чем может быть проблема?


person Muhammad Gelbana    schedule 15.01.2014    source источник


Ответы (2)


Проблема заключалась в том, что Ext GWT 2.2.4 не совместим с GWT 2.5.1, но совместим с GWT 2.5.0.

Таким образом, использование GWT 2.5.0 вместо этого решило проблему.

person Muhammad Gelbana    schedule 16.01.2014
comment
да, спасибо за полезные знания. Я использую GWT 2.5.1. (версия .1) попала к вам :) - person Cataclysm; 17.01.2014

Я думаю, что ваше условие while должно быть динамической переменной вместо использования true. Вы должны выйти из цикла do while. Если нет, ваше выполнение может складываться.

public class TestDoWhile {
private static TestDoWhile test;

public static void main(final String[] args) {
    test = new TestDoWhile();
    test.invokeMethod(2);
    test.invokeMethod(1);
}
public final void invokeMethod(final int testCase) {
    do {
        switch (testCase) {
        case 1:
            System.out.println("Invoke");
            break;
        case 2:
            System.out.println("Please , let me quit !");
            return;
        default:
            return;
        }
    } while (true);
}
}

Каков результат моей Java-программы? Это может складываться. И я не могу представить себе эти два метода sendFreedValues(); ReturnMessage.send(это, результат);

Итак, добавьте return вместо break . Имейте что-нибудь полезное для себя.

person Cataclysm    schedule 16.01.2014
comment
Как я уже говорил, это внутренний код GWT. Я не могу его изменить. Если он плохо себя ведет, значит, что-то очень не так. Это может быть ошибка GWT, в чем я очень сомневаюсь, но даже тогда только команда GWT может решить ее, потому что я ничего не знаю о внутренностях GWT. - person Muhammad Gelbana; 16.01.2014
comment
@MuhammadGelbana Прости меня за это! Если это так, вы должны скопировать его исходные коды и создать собственный виджет или класс, а затем протестировать его снова. Иногда GWT дает мне некоторые ошибки и все же некоторые слабые места. Я понятия не имею о GWT 2.6. - person Cataclysm; 16.01.2014