将 activemq 代理配置拆分为多个文件
Splitting activemq broker configuration into multiple files
我有一个 activemq 代理,我想将它的配置拆分成多个文件。我想准备一个单独的配置文件,它将自动生成并且只包含队列的定义。
文件 1:activemq.xml
<beans ...>
<broker ...>
</broker>
</beans>
文件 2:queues.xml
<beans ...>
<broker ...>
<destinations>
<queue physicalName="q1"/>
</destinations>
</broker>
</beans>
我尝试使用:
Spring 导入:
<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.
有什么想法吗?提前致谢。
这些确实是 spring 配置问题
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
希望对您有所帮助!
祝你好运!
我一直想自己做,但还没有时间尝试,所以我希望你能找到一种方法让它发挥作用。
我想出的唯一想法是尝试使用 Spring 的继承特性来声明一个具有通用 elements/attributes 的超类 bean 和一个子类 bean(具有 parent=superClassBeanID
) 提供的不是标准的。请注意,此方法不需要多个文件;在同一个文件中定义两个 bean,这样您就不必担心那个特定的痛点。
即使可行,这种方法也不会让您覆盖第一层以下的属性和元素,但它可能足以满足您的需要。正如我所说,我没有尝试对此进行测试,因此它可能会惨败。
我在 activemq 论坛上问过,有人在那里发布了解决方案。这是一个答案solution at activemq forum。您可以使用 XML 实体,但必须禁用 XML 验证,因此您必须从:
bin/activemq开始'xbean:conf/activemq.xml?validate=false'
对于尝试在 Openshift 的 JBoss AMQ (+6.2) xPaaS 映像上执行此操作的任何人,需要在容器中修改一个 launch.sh
脚本,其中包含以下行:
exec $AMQ_HOME/bin/activemq console 'xbean:$AMQ_HOME/conf/activemq.xml?validate=false'
请注意使用 'console' 而不是 'start'。
根据 OP 希望拆分配置,您可以使用 DOCTYPE 文件参考定义多个配置文件。
从那里您可以添加自定义授权策略条目等,并使用配置映射安装此配置。
如果这样做,您也可能会破坏 readinessProbe.sh(它无法解析您引入的 XML 元素,例如“&destinationpolicy;”)。幸运的是这个脚本真的只对端口感兴趣(它可以从 ENV 获得!)所以快速 solution/hack 是在解析 XML.
之前去掉那些讨厌的行
我有一个 activemq 代理,我想将它的配置拆分成多个文件。我想准备一个单独的配置文件,它将自动生成并且只包含队列的定义。
文件 1:activemq.xml
<beans ...>
<broker ...>
</broker>
</beans>
文件 2:queues.xml
<beans ...>
<broker ...>
<destinations>
<queue physicalName="q1"/>
</destinations>
</broker>
</beans>
我尝试使用:
Spring 导入:
<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.
有什么想法吗?提前致谢。
这些确实是 spring 配置问题
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
希望对您有所帮助!
祝你好运!
我一直想自己做,但还没有时间尝试,所以我希望你能找到一种方法让它发挥作用。
我想出的唯一想法是尝试使用 Spring 的继承特性来声明一个具有通用 elements/attributes 的超类 bean 和一个子类 bean(具有 parent=superClassBeanID
) 提供的不是标准的。请注意,此方法不需要多个文件;在同一个文件中定义两个 bean,这样您就不必担心那个特定的痛点。
即使可行,这种方法也不会让您覆盖第一层以下的属性和元素,但它可能足以满足您的需要。正如我所说,我没有尝试对此进行测试,因此它可能会惨败。
我在 activemq 论坛上问过,有人在那里发布了解决方案。这是一个答案solution at activemq forum。您可以使用 XML 实体,但必须禁用 XML 验证,因此您必须从: bin/activemq开始'xbean:conf/activemq.xml?validate=false'
对于尝试在 Openshift 的 JBoss AMQ (+6.2) xPaaS 映像上执行此操作的任何人,需要在容器中修改一个 launch.sh
脚本,其中包含以下行:
exec $AMQ_HOME/bin/activemq console 'xbean:$AMQ_HOME/conf/activemq.xml?validate=false'
请注意使用 'console' 而不是 'start'。 根据 OP 希望拆分配置,您可以使用 DOCTYPE 文件参考定义多个配置文件。
从那里您可以添加自定义授权策略条目等,并使用配置映射安装此配置。
如果这样做,您也可能会破坏 readinessProbe.sh(它无法解析您引入的 XML 元素,例如“&destinationpolicy;”)。幸运的是这个脚本真的只对端口感兴趣(它可以从 ENV 获得!)所以快速 solution/hack 是在解析 XML.
之前去掉那些讨厌的行