将 activemq 代理配置拆分为多个文件



我有一个 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,这样您就不必担心该特定痛点。

即使它有效,这种方法也不会让您覆盖第一级以下的属性和元素,但它可能足以满足您的需求。 正如我所说,我没有尝试测试这一点,所以它可能会惨败。

最新更新