Activemq кластер встроенных брокеров и отказоустойчивых потребителей - PullRequest
3 голосов
/ 19 января 2012

Среда

  • Существует существующее программное обеспечение с преимущественным способом кластеризации, которое следует перенести на использование JMS
  • Заказчик не хочет платить за настройку и поддержкусистема обмена сообщениями, поэтому ее можно использовать ТОЛЬКО, если я смогу встраивать весь обмен сообщениями в существующие виртуальные машины.
  • Экземпляры и потребители брокера должны быть в одной JVM.Потребители должны иметь возможность подключаться к удаленному посреднику в ситуациях аварийного переключения, поскольку все потребители, вне зависимости от того, в какой JVM они будут работать, должны иметь ОДНУ входную очередь.
  • было бы хорошо, если бы потребители использовали прямые вызовы методов длясвязаться с локальным брокером

Демонстрационный проект

Я создал очень простой демонстрационный (eclipse) проект с ActiveMQ + Maven + Spring (весь проект находится на http://www.woofiles.com/dl-279452-fOcsWkcm-activemq.zip).Если вы попробуете это, измените dataDirectory activemq, так как до сих пор это абсолютный проводной путь.

Я пытаюсь запустить брокера с весны, а также набор потребителей. См. Конфигурацию Spring ниже:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_FALLBACK" />
    </bean>
        <bean id="embeddedBroker" class="org.apache.activemq.broker.BrokerService"
            destroy-method="stop" init-method="start" >
            <property name="brokerName" value="conversion" />
            <property name="dataDirectory"
                value="c:\eclipseWithMaven\activemq\working\conversion" />
            <property name="schedulerSupport" value="false" />
            <property name="transportConnectorURIs">
                <list>
                    <value>tcp://127.0.0.1:600${idOfClusterNode}</value>
                </list>
            </property>
            <property name="managementContext">
                <bean class="org.apache.activemq.broker.jmx.ManagementContext">
                    <property name="connectorPort" value="201${idOfClusterNode}" />
                </bean>
            </property>
        </bean>

    <!-- depends-on see why at http://activemq.apache.org/vm-transport-reference.html -->
    <!--depends-on="embeddedBroker" -->
    <bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory" depends-on="embeddedBroker">
        <property name="brokerURL">
            <value>failover:(vm:/conversion,tcp://127.0.0.1:6001,tcp://127.0.0.1:6002)</value>
        </property>
    </bean>
    <bean id="cachedConnectionFactory"
        class="org.springframework.jms.connection.CachingConnectionFactory"
        p:targetConnectionFactory-ref="jmsFactory" p:sessionCacheSize="10" />
    <bean id="container"
        class="org.springframework.jms.listener.SimpleMessageListenerContainer">
        <property name="concurrentConsumers" value="10" />
        <property name="connectionFactory" ref="cachedConnectionFactory" />
        <property name="messageListener" ref="conversion" />
        <property name="destination" ref="conversionInputQueue" />
    </bean>
    <bean id="conversionInputQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="conversionInputQueue" />
    </bean>
    <bean id="conversion" class="activemq.Conversion"
        p:clusterId="${idOfClusterNode}" />
</beans>

Я просто пытаюсь запустить один или два экземпляра класса activemq.ConversionDemo с различными параметрами, используемыми конфигурацией spring & log4j. Записи среды конфигурации запуска выглядят так:

  • Экземпляр 1: -DidOfClusterNode = 1 -DidOfOtherClusterNode = 2 -DlogFile = converter1.log
  • Экземпляр 2: -DidOfClusterNode = 2 -DidOfOtherClusterNode = 1 -DlogFile = converter2.log

Если я запустил один экземпляр, это нормально.Если запущено два сервера, возникли следующие проблемы:

  • Второй брокер вообще не запустится.Он говорит, что у него нет блокировки.Это нормально, но я предположил, что он просто запускает поток асинхронно и возвращает управление пружине.Но похоже, что пружина не будет продолжаться.
  • SimpleMessageListenerContainer также похоже удерживает контроль над пружиной до тех пор, пока все потребители не запустятся.

Что я хочу

  • Я хочу соответствовать вышеуказанным требованиям
  • Я думаю, что должен запускать как брокеров, так и потребителей асинхронно, что я не могу сделать весной с этим конфигом
  • Было бы неплохоиметь реальную балансировку нагрузки между брокерами.Похоже, что ActiveMQ подготовлен только для восстановления после отказа.
  • Если ActiveMQ не может удовлетворить мои потребности, пожалуйста, порекомендуйте другое бесплатное решение.

Если вам нужна дополнительная информация, просто дайте мнезнаю.

РЕДАКТИРОВАТЬ

Я думаю, что ActiveMQ поддерживает мои потребности, мне просто нужно понять "сеть брокеров".Поэтому я думаю, что мне нужно иметь два хранилища файлов и сеть от двух моих брокеров.

1 Ответ

3 голосов
/ 20 января 2012

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

Если вы хотите активную / активную настройку, вам нужно будет использовать отдельные хранилища файлов и соединить их вместе как сеть брокеров

...