Среда
- Существует существующее программное обеспечение с преимущественным способом кластеризации, которое следует перенести на использование 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 поддерживает мои потребности, мне просто нужно понять "сеть брокеров".Поэтому я думаю, что мне нужно иметь два хранилища файлов и сеть от двух моих брокеров.