【问题标题】:Splitting activemq broker configuration into multiple files将 activemq 代理配置拆分为多个文件
【发布时间】:2015-03-11 15:37:02
【问题描述】:

我有一个 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

X包含

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: Line 142 in XML > 来自类路径资源 [activemq.xml] 的文档无效;嵌套异常是 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; 必须声明元素类型“beans”。 org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:来自类路径资源 [activemq.xml] 的 XML 文档中的第 28 行无效;嵌套异常是 org.xml.sax.SAXParseException;行号:28;列号:3; 必须声明元素类型“beans”。

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

【问题讨论】:

  • 我现在知道为什么实体方法不起作用了。我使用基于 XSD 的 Spring 配置文件来配置 ActiveMQ 代理,当我添加实体定义时,它会切换到 DTD 验证而不是 XSD,这就是它抱怨未定义元素 bean 的原因。所以实体的定义是正确的,但是 DTD 的使用是有问题的,所以这个解决方案是死路。

标签: xml spring configuration activemq broker


【解决方案1】:

对于任何试图在 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 获得!),所以一个快速的解决方案/hack 是在解析 XML 之前去除顽皮的行。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 好吧,我需要使用现有的使用自定义元素的配置模式,所以我认为它不会起作用。谢谢你的回答。
      • 太糟糕了;我一直在查看你是否发布了解决方案,希望你能找到一种方法让它发挥作用,这样我就可以做同样的事情。
      • 我在activemq论坛上问过,有人在那里发布了解决方案。这是一个答案。 link 可以使用 XML 实体,但必须禁用 XML 验证,所以必须从:bin/activemq start 'xbean:conf/activemq.xml?validate=false'
      【解决方案4】:

      这些确实是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

      希望这会有所帮助!

      祝你好运!

      【讨论】:

      • 感谢您的回答。我知道这些错误消息的含义,我不知道如何修改它们或找到另一种方法来做我想做的事情。 InstanceAlreadyExists - 有没有办法让两个代理元素应用于同一个代理? xs:include - 我定义了命名空间,但显然 XML 解析器不支持 XInclude(这是一个死胡同,因为我不想添加额外的依赖项)。 SAX 解析 - 从我阅读的内容来看,应该没问题,但我没有任何定义 XML 实体的经验,所以也许有人可以告诉我,我做错了什么。
      • 为此您需要发布整个代码,没有它我们无法从这里感觉到问题
      • @Vihar,您为什么看不到 OP 已经发布的问题?对我来说似乎很清楚......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多