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

时间:2015-01-13 15:58:47

标签: xml spring configuration activemq broker

我有一个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:在类路径资源[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创建错误:init方法的调用失败;嵌套异常是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:XML中的第142行&gt;类路径资源[activemq.xml]中的文档无效;嵌套异常是org.xml.sax.SAXParseException; lineNumber:142; columnNumber:45; cvc-complex-type.2.4.c:匹配的通配符是strict,但是找不到元素'xi:include'的声明。   org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:来自类路径资源[activemq.xml]的XML文档中的第142行无效;嵌套异常是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:来自类路径资源[activemq.xml]的XML文档中的第28行无效;嵌套异常是org.xml.sax.SAXParseException; lineNumber:28; columnNumber:3; 必须声明元素类型“bean”。   org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:来自类路径资源[activemq.xml]的XML文档中的第28行无效;嵌套异常是org.xml.sax.SAXParseException; lineNumber:28; columnNumber:3; 必须声明元素类型“bean”。

有什么想法吗?提前谢谢。

4 个答案:

答案 0 :(得分:2)

我在activemq论坛上问过,有人在那里发布了一个解决方案。这是一个答案solution at activemq forum。您可以使用XML实体,但必须禁用XML验证,因此必须从以下开始:     bin / activemq start'xym:conf / activemq.xml?validate = false'

答案 1 :(得分:1)

对于任何试图在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元素,如'&amp; destinationpolicy;')。幸运的是,这个脚本真的只对端口感兴趣(它可以从ENV获得!)所以一个快速的解决方案/黑客就是在解析XML之前去除顽皮的行。

答案 2 :(得分:0)

这些确实是弹簧配置问题

  • javax.management.InstanceAlreadyExistsException是你造成的 尝试创建2个具有相同名称的bean,因此请在您的配置中 检查您是否尝试创建具有相同名称的2个bean。
  • The matching wildcard is strict, but no declaration can be found for element 'xi:include'当ddo没有你的时候会发生这个错误 命名空间配置(即'xi'不是为此配置的命名空间 弹簧配置,你需要明确定义它)
  • 当你的xml不好时,通常会抛出
  • SAX parse exception 形成或不坚持特定的DTD

希望这有帮助!

祝你好运!

答案 3 :(得分:0)

我自己想要这样做,但还没有时间去尝试,所以我希望你能找到一种方法让它发挥作用。

我提出的唯一想法是尝试使用Spring的继承功能来声明具有公共元素/属性和子类bean(带有parent=superClassBeanID)的超类bean提供不标准的。请注意,此方法不需要多个文件;在同一个文件中定义两个bean,这样你就不必担心这个特定的痛点。

即使它有效,这种方法也不会让你覆盖第一级以下的属性和元素,但它可能足以满足你的需要。正如我所说,我没有试图对此进行测试,因此它可能会失败。