3

我有一个 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:创建名为 'org.apache.activemq.xbean.XBeanBrokerService#1' 的 bean 时出错在类路径资源 [queues.xml] 中定义:调用 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:类路径资源 [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”。

有任何想法吗?提前致谢。

4

4 回答 4

2

我在activemq论坛上问过,有人在那里发布了解决方案。这是activemq 论坛上的答案解决方案。你可以使用 XML 实体,但是你必须禁用 XML 验证,所以你必须开始: bin/activemq start 'xbean:conf/activemq.xml?validate=false'

于 2015-02-10T15:02:56.070 回答
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 之前去除顽皮的行。

于 2017-03-28T03:02:21.557 回答
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”不是此 spring 配置的配置命名空间,您需要显式定义它)
  • SAX parse exception通常在您的 xml 格式不正确或不符合特定 DTD 时抛出

希望这可以帮助!

祝你好运!

于 2015-01-14T04:56:01.083 回答
0

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

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

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

于 2015-01-14T22:46:05.557 回答