2015-01-13 5 views
2

У меня есть агент activemq, и я хочу разбить его конфигурацию на несколько файлов. Я хочу подготовить отдельный файл конфигурации, который будет сгенерирован автоматически и будет содержать только определения очередей.Разделение конфигурации брокера activemq на несколько файлов

Файл 1: activemq.xml

<beans ...> 
    <broker ...> 

    </broker> 
</beans> 

Файл 2: queues.xml

<beans ...> 
    <broker ...> 
    <destinations> 
     <queue physicalName="q1"/> 
    </destinations> 
    </broker> 
</beans> 

Я пытался использовать:

Весна импорта:

<import resource="queues.xml"/> 

но получил

ERROR: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.activemq.xbean.XBeanBrokerService#1' defined in class path resource [queues.xml]: Invocation of init method failed; nested exception is javax.management.InstanceAlreadyExistsException: org.apache.activemq:type=Broker,brokerName=localhost org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.activemq.xbean.XBeanBrokerService#1' defined in class path resource [queues.xml]: Invocation of init method failed; nested exception is javax.management.InstanceAlreadyExistsException: org.apache.activemq:type=Broker,brokerName=localhost

XInclude:

activemq.xml:

<beans ... 
    xmlns:xi="http://www.w3.org/2001/XInclude" 
> 
    <broker ...> 
    <xi:include href="queues.xml" parse="xml"/> 
    </broker> 

</beans> 

но получил

ERROR: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 142 in XML > document from class path resource [activemq.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 142; columnNumber: 45; cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'xi:include'. org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 142 in XML document from class path resource [activemq.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 142; columnNumber: 45; cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'xi:include'.

Xml лица activemq.xml

<!DOCTYPE beans [ 
<!ENTITY queues SYSTEM "queues.xml"> 
]> 
<beans ...> 
    <broker ...> 
    &queues; 
    </broker> 
</beans> 

но получил

ERROR: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 28 in XML document from class path resource [activemq.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 3; Element type "beans" must be declared. org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 28 in XML document from class path resource [activemq.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 3; Element type "beans" must be declared.

Любые идеи? Заранее спасибо.

+0

Теперь я знаю, почему подход сущности не работает. Я использую файлы конфигурации Spring на основе XSD для настройки брокер ActiveMQ, и когда я добавляю определение сущности, он переключается на проверку DTD вместо XSD, и именно поэтому он жалуется на то, что элементные элементы не определены. Таким образом, сущность определяется правильно, но само использование DTD является проблематичным, и поэтому это решение является мертвым. – rattaman

ответ

2

Я спросил на форумах activemq и кто-то разместил там решение. Вот ответ solution at activemq forum. Вы можете использовать XML-объекты, но вам нужно отключить проверку XML, поэтому вам нужно начать с: bin/activemq start 'xbean: conf/activemq.xml? Validate = false'

0

это действительно проблемы конфигураций пружинных

  • javax.management.InstanceAlreadyExistsException вызываются, когда вы пытаетесь создать 2 фасоли с таким же именем, так и в конфигурации, пожалуйста проверить, если вы пытаетесь создать 2 фасоли с одинаковыми именами.
  • The matching wildcard is strict, but no declaration can be found for element 'xi:include' эта ошибка возникает, когда ПДИ не имеет ваши имен сконфигурированы (например, «х» не сконфигурировано пространство имен для этой конфигурации яровой, необходимо явно определить его)
  • SAX parse exception обычно выбрасываются, если ваш XML не скважина сформирована или не соответствует конкретному DTD

надеюсь, что это поможет!

Удачи вам!

+0

Благодарим вас за ответ. Я знаю о значении этих сообщений об ошибках, чего я не знаю, как изменить их или найти другой способ делать то, что я хочу делать. InstanceAlreadyExists - есть ли способ, чтобы два брокерских элемента применялись к одному и тому же брокеру? xs: include - Я определил пространство имен, но, по-видимому, синтаксический анализатор XML не поддерживает XInclude (это тупик, поскольку я не хочу добавлять дополнительные зависимости). SAX parse - из того, что я читал, должно быть хорошо, но у меня нет опыта в определении XML-сущностей, поэтому, возможно, кто-то может сказать мне, что я делаю неправильно. – rattaman

+0

Для этого вам нужно опубликовать весь код, без него мы не можем понять эту проблему – Vihar

+0

@Vihar, почему вы не видите проблему, основанную на том, что OP уже опубликовал? Мне кажется довольно ясным ... – Tim

0

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

Единственная идея, с которой я столкнулся, состоит в том, чтобы попытаться использовать функцию наследования Spring для объявления суперкласса bean с общими элементами/атрибутами и компонентом подкласса (с parent=superClassBeanID), который предоставляет те, которые не являются стандартными. Обратите внимание, что для этого подхода вам не нужны несколько файлов; определите оба компонента в одном файле, чтобы вам не пришлось беспокоиться об этой конкретной точке боли.

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

+0

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

+0

Слишком плохо; Я продолжал проверять, не нашел ли вы решение, надеясь, что вы нашли способ заставить его работать, чтобы я мог сделать то же самое. – Tim

+0

Я спросил на форумах activemq и кто-то разместил там решение. Вот ответ. [ссылка] (http://activemq.2283324.n4.nabble.com/Split-ActiveMQ-broker-configuration-into-multiple-files-tp4690947.htm) Вы можете использовать XML-сущности, но вам нужно отключить проверку XML, поэтому вам нужно начать с: 'bin/activemq start 'xbean: conf/activemq.xml? validate = false'' – rattaman

1

Для тех, кто пытается это сделать, OpenShift в JBoss AMQ (+ 6,2) xPaaS изображения, есть launch.sh скрипт, который должен быть изменен в контейнере с линией:

exec $AMQ_HOME/bin/activemq console 'xbean:$AMQ_HOME/conf/activemq.xml?validate=false' 

Обратите внимание на использование «консоли», а не «старт». В соответствии с желаемым разделом конфигурации OP вы можете определить несколько файлов конфигурации с помощью ссылки на файл DOCTYPE.

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

Если вы это сделаете, вы, скорее всего, также сломаете readinessProbe.sh (он не сможет проанализировать XML-элементы, которые вы вводите как '& destinationpolicy;'). К счастью, этот сценарий действительно интересует только порты (которые он может получить от ENV!), Поэтому быстрое решение/взлома - это отбросить непослушные строки перед разбором XML.