Использование URI отработки отказа в клиенте ActiveMQ Ajax

Я использую клиент ajax для подключения к activemq. Может ли клиент ActiveMQ ajax поддерживать отказоустойчивый транспорт? Я использую встроенный Jetty внутри брокера, который использует транспорт vm для пересылки сообщений брокеру.

Клиент AJAX отправляет сообщения брокеру, используя URL

http://localhost:8161/api/amq

Как я могу обеспечить поддержку отказоустойчивости в этом.

FWIW Я использую amq.js.

Спасибо, Бхану.


person Bhanu    schedule 20.05.2013    source источник


Ответы (2)


Добавьте следующие функции получения и установки в конец объекта, возвращаемого в файле amq.js (т. е. после функции testPollHandler):

setUri: function(newUri) {
    uri = newUri;
},
getUri: function() {
    return uri;
}

Затем сделайте что-то вроде этого, чтобы переключиться на следующий сервер, если соединение не может быть установлено:

var ACTIVEMQ_SERVERS = ["http://server1:8161/ajax/amq","http://server2:8161/ajax/amq"];
var amq = org.activemq.Amq;

function connectStatusHandler(connected) {
    if (!connected) {     
        var index = _.indexOf(ACTIVEMQ_SERVERS, amq.getUri());
        var newIndex = (index + 1) % ACTIVEMQ_SERVERS.length;
        var uri = ACTIVEMQ_SERVERS[newIndex];
        amq.setUri(uri);

        if (window.console) {
            console.log("Lost connection. Attempting next server: " + uri);
        }
    }
}

amq.init({
    uri: ACTIVEMQ_SERVERS[0],
    logging: true,
    timeout: 20,
    connectStatusHandler: connectStatusHandler,
    logging: true
});

Вам также потребуется включить CORS на сервере Jetty, на котором размещен AjaxServlet, если вы хотите установить соединения между серверами. Для этого включите встроенный фильтр Jetty CORS со следующей конфигурацией в файле web.xml:

<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
    <init-param>
      <param-name>allowedOrigins</param-name>
      <param-value>*</param-value>
    </init-param>
    <init-param>
      <param-name>allowedMethods</param-name>
      <param-value>*</param-value>
    </init-param>
    <init-param>
      <param-name>allowedHeaders</param-name>
      <param-value>*</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>cross-origin</filter-name>
    <url-pattern>/amq/*</url-pattern>
</filter-mapping>
person Phyxx    schedule 02.01.2015

Отказоустойчивый транспорт предназначен для соединений OpenWire. Для HTTP вам нужен какой-то другой механизм аварийного переключения, например балансировщик нагрузки, который знает, какие узлы находятся в сети, а какие нет.

person Petter Nordlander    schedule 20.05.2013
comment
Хм, у нас есть поддержка балансировщика нагрузки, но мы используем его в основном для переключения между DR и обычным режимом. Было интересно, есть ли простой способ для этого. - person Bhanu; 20.05.2013
comment
Ну, в amq.js нет поддержки на стороне клиента для аварийного переключения. Если вы не хотите переключаться на настройку каким-либо другим способом, вам нужно полагаться на механизм аварийного переключения HTTP, такой как балансировщик нагрузки (может быть даже программный балансировщик нагрузки, использующий Nginx или аналогичный) - person Petter Nordlander; 20.05.2013