我有一个 activemq 代理,我想将其配置拆分为多个文件。我想准备一个单独的配置文件,该文件将自动生成,并且仅包含队列的定义。
文件 1: activemq.xml
<beans ...>
<broker ...>
</broker>
</beans>
文件 2:队列.xml
<beans ...>
<broker ...>
<destinations>
<queue physicalName="q1"/>
</destinations>
</broker>
</beans>
我尝试使用:
春季进口:
<import resource="queues.xml"/>
但得到了
错误:org.springframework.beans.factory.BeanCreation异常:创建类路径资源 [queues.xml] 中定义的名称为"org.apache.activemq.xbean.XBeanBrokerService#1"的 bean 时出错:调用 init 方法失败;嵌套异常是 javax.management.InstanceAlreadyExistsException: org.apache.activemq:type=Broker,brokerName=localhost org.springframework.beans.factory.BeanCreationException: 创建类路径资源 [queues.xml] 中定义的名称为"org.apache.activemq.xbean.XBeanBrokerService#1"的 bean 时出错:初始化方法的调用失败;嵌套异常是 javax.management.InstanceAlreadyExistsException: org.apache.activemq:type=Broker,brokerName=localhost
十一:
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:来自类路径资源 [activemq.xml] 的 XML>文档中的第 142 行无效;嵌套异常是 org.xml.sax.SAXParseException;行号:142;列号:45;cvc-complex-type.2.4.c:匹配的通配符是严格的,但找不到元素 'xi:include' 的声明。org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: 来自类路径资源 [activemq.xml] 的 XML 文档中的第 142 行无效;嵌套异常是 org.xml.sax.SAXParseException;行号: 142;列数: 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:来自类路径资源 [activemq.xml] 的 XML 文档中的第 28 行无效; 嵌套异常是 org.xml.sax.SAXParseException; 行号: 28; 列数: 3;必须声明元素类型"bean"。 org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: 来自类路径资源 [activemq.xml] 的 XML 文档中的第 28 行无效;嵌套异常是 org.xml.sax.SAXParseException;行号: 28;列数: 3;必须声明元素类型"bean"。
有什么想法吗?提前谢谢。
我在activemq论坛上问过,有人在那里发布了一个解决方案。这是activemq论坛上的答案解决方案。您可以使用 XML 实体,但必须禁用 XML 验证,因此必须从以下方面开始: bin/activemq start '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'
请注意使用"控制台"而不是"开始"。根据 OP 希望拆分配置,您可以使用 DOCTYPE 文件引用定义多个配置文件。
从那里您可以添加自定义授权策略条目等,并使用配置映射挂载此配置。
如果这样做,您也可能会破坏 readinessProbe.sh(它无法解析您引入的 XML 元素,如"&destinationpolicy;")。幸运的是,这个脚本实际上只对端口感兴趣(它可以从ENV获得!),所以一个快速的解决方案/黑客是在解析XML之前剥离顽皮的行。
这些确实是弹簧配置问题
-
javax.management.InstanceAlreadyExistsException
是由您引起的尝试创建 2 个同名的 bean,所以请在您的配置中检查您是否正在尝试创建 2 个具有相同名称的 bean。 -
The matching wildcard is strict, but no declaration can be found for element 'xi:include'
当 DDO 没有您的已配置命名空间(即"xi"不是为此配置的命名空间弹簧配置,需要明确定义) -
SAX parse exception
通常在 xml 不好时抛出形成或不遵守特定的 DTD
希望这有帮助!
祝你好运!
我想自己做这个,但还没有时间尝试,所以我希望你能找到一种方法让它工作。
我想出的唯一想法是尝试使用 Spring 的继承功能来声明一个具有公共元素/属性的超类 bean,以及一个提供非标准元素/属性的子类 bean(带有 parent=superClassBeanID
)。 请注意,此方法不需要多个文件;在同一文件中定义两个 bean,这样您就不必担心该特定痛点。
即使它有效,这种方法也不会让您覆盖第一级以下的属性和元素,但它可能足以满足您的需求。 正如我所说,我没有尝试测试这一点,所以它可能会惨败。