Проблемы с параллельными вызовами к удаленным объектам - PullRequest
0 голосов
/ 29 ноября 2009

У меня есть следующее приложение в flex. Я хочу вызвать два разных удаленных объекта параллельно.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
 <mx:RemoteObject id="service1" destination="test1" />
    <mx:RemoteObject id="service2" destination="test2" />
    <mx:Button label="service1" click="{service1.method(1)}" />
    <mx:Button label="service2" click="{service2.method(2)}" />
    <mx:Button label="service1 AND service2" click="{service1.method(1);service2.method(2)}" />
</mx:Application>

Каждый удаленный объект связан с другой реализацией Java, которая называется TestCase1 и TestCase2. Поэтому я подумал, что мог бы вызывать два объекта параллельно и выполнять их параллельно друг другу.

public class TestCase1 {

 public void method(int n) {
        System.out.println("method(" + n + ") starts");
        try {
            Thread.sleep(8000);
        } catch(InterruptedException e) {}
        System.out.println("method(" + n + ") ends");
    }

}

public class TestCase2 {

 public void method(int n) {
        System.out.println("method(" + n + ") starts");
        try {
            Thread.sleep(8000);
        } catch(InterruptedException e) {}
        System.out.println("method(" + n + ") ends");
    }

}

Теперь, что методы делают, чтобы напечатать sth. когда они вызваны, подождите 8 секунд и напечатайте sth. после этого.

При отдельном нажатии на каждую кнопку все работает, оба метода запускаются параллельно. Однако, вызывая оба метода в одно и то же время, одна служба остается в ожидании своего вызова, пока другой не выполнится.

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

Thx Philipp

enter code here

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Если у вас много запросов - callLater не поможет, так как весь запрос будет выполняться параллельно в следующем кадре. Дайте мне знать, что вы думаете об этой душе: добавьте массив функций, который мы будем вызывать с помощью обратного вызова, который нам нужно запустить только для каждого кадра, и добавим список событий: ENTER_FRAME, чтобы в каждом входном кадре мы извлекали одну функцию из массива и выполняли ее. Массив и событие будут в основном приложении.

Спасибо

0 голосов
/ 29 ноября 2009

Запросы RemoteObject помещаются в очередь до следующего кадра выполнения, а затем отправляются через тот же HTTP-запрос, т.е. несколько операций над одним и тем же запросом. Поэтому, когда вы звоните: service1.method(1);service2.method(2)
Обе операции выполняются по одному и тому же HTTP-запросу. Первый приводит к тому, что обработка потока этого запроса переходит в спящий режим, в результате чего вторая операция не вызывается, пока поток не возобновится.

Единственный известный мне способ избежать этого - убедиться, что каждая операция выполняется по собственному HTTP-запросу и, таким образом, получает свой собственный поток. Но помните, что вы получаете только 2 одновременных HTTP-запроса в большинстве браузеров. Поэтому, если вы делаете более двух запросов одновременно, вы все равно будете заблокированы и не будете параллельны после двух одновременных операций.

Простой способ получить запросы на следующий кадр - использовать callLater, например:

service1.method(1);  
callLater(function():void { service2.method(2) });

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

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