Разделение конфигурации брокера 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"/>

но получил

ОШИБКА: org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем org.apache.activemq.xbean.XBeanBrokerService # 1, определенным в ресурсе пути к классу [queues.xml]: не удалось вызвать метод инициализации; вложенное исключение: javax.management.InstanceAlreadyExistsException: org.apache.activemq: type = Broker, brokerName = localhost org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем org.apache.activemq.xbeanker.XBeviceanBro # 1 'определено в ресурсе пути к классу [queues.xml]: не удалось вызвать метод инициализации; вложенное исключение - 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>

но получил

ОШИБКА: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: строка 142 в XML> документе из ресурса пути к классу [activemq.xml] недопустима; вложенное исключение - org.xml.sax.SAXParseException; lineNumber: 142; columnNumber: 45; cvc-complex-type.2.4.c: Соответствующий подстановочный знак является строгим, но для элемента xi: include не найдено объявление. org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 142 в документе XML из ресурса пути к классу [activemq.xml] недопустим; вложенное исключение - org.xml.sax.SAXParseException; lineNumber: 142; columnNumber: 45; cvc-complex-type.2.4.c: Соответствующий подстановочный знак строгий, но для элемента xi: include не найдено декларации.

Сущности XML activemq.xml

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

но получил

ОШИБКА: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: строка 28 в XML-документе из ресурса пути к классу [activemq.xml] недопустима; вложенное исключение - org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 3; Необходимо объявить тип элемента "beans". org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: строка 28 в XML-документе из ресурса пути к классу [activemq.xml] недопустима; вложенное исключение - org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 3; Необходимо объявить тип элемента "beans".

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


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


Ответы (4)


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

person rattaman    schedule 10.02.2015

Для тех, кто пытается сделать это с изображениями 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-элементы, которые вы вводите как ''). К счастью, этот сценарий действительно интересует только порты (которые он может получить из ENV!), Поэтому быстрое решение / взлом - убрать непослушные строки перед синтаксическим анализом XML.

person ted-k42    schedule 28.03.2017

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

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

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

Удачи!

person Vihar    schedule 14.01.2015
comment
Спасибо за ваш ответ. Мне известно значение этих сообщений об ошибках, но я не знаю, как их исправить или найти другой способ сделать то, что я хочу сделать. InstanceAlreadyExists - есть ли способ применить два элемента брокера к одному и тому же брокеру? xs: include - я определил пространство имен, но, очевидно, синтаксический анализатор XML не поддерживает XInclude (это тупик, поскольку я не хочу добавлять дополнительные зависимости). Анализ SAX - судя по тому, что я читал, все должно быть в порядке, но у меня нет опыта в определении сущностей XML, поэтому, возможно, кто-нибудь скажет мне, что я делаю не так. - person rattaman; 14.01.2015
comment
для этого вам нужно опубликовать весь код, без него мы не сможем ощутить проблему отсюда - person Vihar; 14.01.2015
comment
@Vihar, почему вы не видите проблему на основе того, что уже было опубликовано OP? Мне это кажется довольно ясным ... - person Tim; 15.01.2015

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

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

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

person Tim    schedule 14.01.2015
comment
Что ж, мне нужно использовать существующую схему конфигурации, в которой используются настраиваемые элементы, поэтому я не думаю, что это сработает. Спасибо за ваш ответ. - person rattaman; 03.02.2015
comment
Очень плохо; Я все время проверял, опубликовали ли вы решение, надеясь, что вы нашли способ заставить его работать, чтобы я мог сделать то же самое. - person Tim; 03.02.2015
comment
Я спросил на форумах activemq, и кто-то опубликовал там решение. Вот ответ. ссылка Вы можно использовать XML-сущности, но вы должны отключить проверку XML, поэтому вам нужно начать с: bin/activemq start 'xbean:conf/activemq.xml?validate=false' - person rattaman; 10.02.2015