Более одного канала в BlazeDS - PullRequest
2 голосов
/ 21 марта 2012

Я пытаюсь настроить сценарий, в котором приложение Flex сможет использовать ресурсы, написанные в двух разных веб-приложениях, реализующих BlazeDS.

Первоначально я пытался сделать это, , указав набор каналов в моем коде mxml , а затем установив его в качестве набора каналов службы в mxml. Однако, хотя это сработало, я получал повторяющиеся ошибки сеанса.

Было предложено в одном из ответов на мой вопрос, связанный с вышеупомянутым , что я мог / должен увидеть о настройке каналов с разными конечными точками. Я предполагаю, что это означает, что приложение Flex будет подключаться только к одному сервису в том виде, в каком оно его видит, но сервис на самом деле будет также доставлять этот сервис из другого местоположения.

Я попытался сделать следующее в своем services-config.xml:

        <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>

        <channel-definition id="my-amf2" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://localhost:7001/dataservice1/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>

Но при попытке запустить сервер я получаю следующие ошибки в консоли weblogic.

Не удалось зарегистрировать конечную точку my-amf, поскольку ее URL-адрес '/ messagebroker / amf', уже используется конечной точкой 'my-amf2'

и

«MessageBrokerServlet» не удалось предварительно загрузить при запуске в Web Приложение: "/ dataservice2". flex.messaging.config.ConfigurationException: не удалось зарегистрироваться конечная точка 'my-amf', поскольку ее URL-адрес '/ messagebroker / amf' уже используется конечной точкой 'my-amf2'

и

Невозможно установить для состояния активации значение true для приложения. '_Appsdir_DataService2_dir. weblogic.application.ModuleException: [HTTP: 101216] Сервлет: «MessageBrokerServlet» не удалось предварительно загрузить на запуска в веб-приложении: "/dataservice2".

Я предполагаю, что это потому, что у вас может быть только один канал класса mx.messaging.channels.AMFChannel. Это правильно?

В общем, есть ли способ обойти любую проблему, с которой я сталкиваюсь? Я открыт для разных решений.

Я гуглил и читал часами, но ничего не могу найти по этому поводу.

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

Ответы [ 2 ]

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

Я просто обобщу то, что мы обсуждали, чтобы другие читатели могли извлечь пользу.

Давайте внимательно посмотрим на сообщение об ошибке:

Не удалось зарегистрировать конечную точку 'my-amf 'потому что его URL,' / messagebroker / amf ', уже используется конечной точкой' my-amf2 '

Он говорит о' / messagebroker / amf 'и не упоминает частьURL до этого, то есть часть с номером порта.Отсюда можно сделать вывод, что BlazeDS просто игнорирует эту первую часть, когда выясняет, что две конечные точки идентичны или нет.Таким образом, http://localhost:7001/dataservice1/messagebroker/amf и http://localhost:7002/dataservice2/messagebroker/amf будут считаться идентичными, даже если они указывают на другой экземпляр.

быстрое исправление

ПростоеДля решения этой проблемы можно просто переименовать вторую конечную точку после последней косой черты.Например, http://localhost:7001/dataservice1/messagebroker/amf2 уже должен сделать свое дело.Я не думаю, что вам есть о чем беспокоиться, так как сервлет MessageBroker имеет сопоставление с подстановочным знаком после этой последней косой черты (/messagebroker/*), которое перенаправит любой адрес, отформатированный таким образом, на правильный сервлет.

но почему?

Возможно, вам следует пересмотреть, почему вы пытаетесь это сделать.Причина, по которой BlazeDS проверяет только последнюю часть, заключается в том, что разработчики, вероятно, просто не подумали о том, что кто-то на самом деле попытается указать конечную точку на другой экземпляр.Кроме того, в вашей настройке этот другой экземпляр уже имеет такое же определение канала.Вы можете просто подключиться к этому каналу, чтобы не было необходимости в этой маршрутизации с первого экземпляра.Я понятия не имею, чего вы пытаетесь достичь, поэтому все, что я могу вам сказать, это то, что вы, вероятно, подходите к этому под неправильным углом.

0 голосов
/ 26 марта 2012

Немного не в тему, но вы рассматривали возможность использования GraniteDS ? Это обеспечит вам гораздо лучшую производительность и масштабируемость обмена сообщениями в реальном времени благодаря поддержке асинхронных сервлетов WebLogic (см. здесь и здесь ). Подключение к двум различным веб-приложениям также не должно быть проблемой, поскольку два контекста обмена сообщениями (определения каналов и т. Д.) Будут сохраняться в отдельных контекстах сервлета.

...