Можно ли подключить гибкое приложение к двум различным серверам BlazeDS? - PullRequest
0 голосов
/ 15 марта 2012

Мой вопрос: возможно ли подключиться к двум различным серверам BlazeDS из одного приложения Flex? Я уже прочитал этот вопрос: Может ли клиентское приложение Flex подключаться к BlazeDS, запущенному на другом сервере? Однако, как представляется, обсуждается возможность подключения клиента Flex к BlazeDS на другом сервере, но необязательно к другому BlazeDS на другом сервере.

Я также читал этот вопрос: Один клиент Flex, подключающийся к двум веб-приложениям с помощью BlazeDS - обнаружены дубликаты FlexSessions на основе HTTP

В попытках, которые я попробовал, я получаю ошибку, упомянутую во втором вопросе выше: Обнаруженные дубликаты FlexSessions на основе HTTP, как правило, из-за того, что удаленный хост отключил куки сеанса. Сеансовые куки должны быть включены для правильного управления клиентским подключением.

Совершенно невозможно подключение одного приложения Flex к двум серверам с поддержкой BlazeDS? Мы хотим иметь сервер BlazeDS с «общей функциональностью», который используется рядом приложений Flex, каждое из которых имеет собственный локальный сервер BlazeDS для своей собственной функциональности.

// Редактировать То, как я сейчас это делаю:

В моем файле mxml я определяю канал следующим образом:

        <mx:ChannelSet id="dataService1Channel">
            <mx:channels>
                <mx:AMFChannel id="dataService1AmfChannel"
                               channelFault="dataService1Fault(event)"
                               url="http://localhost:7001/dataservice1/messagebroker/amf"/>
            </mx:channels>
        </mx:ChannelSet>

И затем я использую этот набор каналов в следующей настроенной службе данных (которая была автоматически настроена, когда я использовал функцию FlashBuilder «Connect to BlazeDS»)

      <dataservice1:DataService1Service id="dataService1Service"
                                          fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
                                          showBusyCursor="true"
                                          channelSet="{dataService1Channel}"/>

Другая служба данных определяется следующим образом:

      <dataservice2:DataService2Service id="dataService2Service"
                                          fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
                                          showBusyCursor="true"/>

Звонки работают, и я могу получить данные, но я получаю это предупреждение, о котором я упоминал в форме предупреждения в приложении Flex. Если бы я мог подавить это предупреждение, я был бы счастлив.

Ответы [ 2 ]

1 голос
/ 13 июля 2012

Ну, я столкнулся с той же проблемой при соединении двух серверов BlazeDS с SINGLE flex-клиентом (swf). На самом деле, как говорит гибкая документация:

"Каждое приложение Flex, написанное в MXML или ActionScript, в конечном итоге компилируется в SWF-файл. Когда SWF-файл подключается к серверу BlazeDS, создается объект flex.messaging.client.FlexClient для представления этого SWF-файла в сервер. SWF-файлы и экземпляры FlexClient имеют взаимно-однозначное сопоставление. В этом сопоставлении каждый экземпляр FlexClient имеет уникальный идентификатор с именем id, который генерируется сервером BlazeDS. Также создается одноэлементный класс ActionScript mx.messaging.FlexClient. для приложения Flex для доступа к его уникальному идентификатору FlexClient. "

Например, у вас есть два сервера BlazeDS. 1) УДАЛЕНО 2) ЛОКАЛЬНЫЙ и одиночный FlexApp (swf) «MyClient».

Шаг 1. MyClient подключается к удаленному серверу BlazeDS. Таким образом, генерируется один уникальный идентификатор.

Шаг 2. Теперь MyClient подключается к локальному серверу BlazeDS. Тот же идентификатор, сгенерированный на шаге 1, будет использоваться, поскольку для одного FlexApp (swf) может быть сгенерирован только один уникальный идентификатор.

Шаг 3. Теперь MyClient снова подключится к удаленному серверу BlazeDS. Помните, что каждый раз, когда FlexApp (SWF) подключается к серверу BlazeDS, генерируется уникальный FlexClient, а также уникальный идентификатор. Итак, теперь на этом шаге 3 у нас уже есть идентификатор, сгенерированный на шаге 1. Поэтому, безусловно, он выдаст исключение Duplicate Session.

Решение: В моей заявке есть обходной путь, который я нашел и применил. Оно работает. Каждый раз, когда FlexApp (swf) переключает сервер blazeDS, генерируйте id = null.

FlexClient.getInstance().id=null;

В приведенном выше примере сделайте id = null после шага 1. Теперь, когда он подключится к LOCAL blazeDS, он не будет использовать идентификатор, сгенерированный на шаге 1. Вместо этого он создаст один новый уникальный идентификатор при работе в LOCAL. режим BlazeDS.

Опять же, когда вы переключаетесь из ЛОКАЛЬНОГО в ДИСТАНЦИОННЫЙ режим (Шаг 3), сделайте id = null этим фрагментом кода. Итак, теперь, когда FlexApp (swf) подключается к REMOTE blazeDS, будет сгенерирован новый уникальный идентификатор, и не будет исключения Duplicate Session.

Спасибо и всего наилучшего, Анупам Г.

1 голос
/ 15 марта 2012

Подключает одно приложение Flex к двум серверам с поддержкой BlazeDS совершенно невозможно?

Да! Я не вижу причин, по которым вы бы не смогли этого сделать, предполагая, что имеются соответствующие файлы crossdomain.xml.

[Обратите внимание, с этого момента я предполагаю, что вы используете BlazeDS вместе с RemoteObjects / AMF]

Для этого; Скорее всего, вы создадите разные конечные точки в своем файле config-услуг. Конечная точка по умолчанию [по крайней мере для конфигурации служб, включенной в ColdFusion], автоматически указывает на сервер, с которого обслуживается SWF. Нет причины, по которой вы не можете создавать свои собственные конечные точки, даже разные конечные точки в одном файле настроек служб. Вы также можете определить точки выполнения во время выполнения, если считаете, что это необходимо.

Я не уверен, почему вы будете получать ошибки, связанные с сеансом; если ваш серверный код не требует сессий.

...