2015-01-13 57 views
2

我有一個activemq代理,我想將其配置拆分爲多個文件。我想準備一個單獨的配置文件,它會自動生成,並且只包含隊列的定義。將activemq代理配置拆分爲多個文件

文件1:activemq.xml中

<beans ...> 
    <broker ...> 

    </broker> 
</beans> 

文件2:queues.xml

<beans ...> 
    <broker ...> 
    <destinations> 
     <queue physicalName="q1"/> 
    </destinations> 
    </broker> 
</beans> 

我試着使用:

春進口

<import resource="queues.xml"/> 

,但得到

ERROR: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.activemq.xbean.XBeanBrokerService#1' defined in class path resource [queues.xml]: Invocation of init method failed; nested exception is javax.management.InstanceAlreadyExistsException: org.apache.activemq:type=Broker,brokerName=localhost org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.activemq.xbean.XBeanBrokerService#1' defined in class path resource [queues.xml]: Invocation of init method failed; nested exception is 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> 

,但得到

ERROR: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 142 in XML > document from class path resource [activemq.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 142; columnNumber: 45; cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'xi:include'. org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 142 in XML document from class path resource [activemq.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 142; columnNumber: 45; cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'xi:include'.

XML實體 activemq.xml中

<!DOCTYPE beans [ 
<!ENTITY queues SYSTEM "queues.xml"> 
]> 
<beans ...> 
    <broker ...> 
    &queues; 
    </broker> 
</beans> 

,但得到

ERROR: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 28 in XML document from class path resource [activemq.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 3; Element type "beans" must be declared. org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 28 in XML document from class path resource [activemq.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 3; Element type "beans" must be declared.

任何想法?提前致謝。

+0

我現在知道爲什麼實體方法不起作用。我使用基於XSD的Spring配置文件來配置ActiveMQ代理,並且當我添加實體定義時,它切換到DTD驗證而不是XSD,這就是爲什麼它抱怨元素bean沒有被定義。所以實體的定義是正確的,但DTD的使用是有問題的,所以這個解決方案是一個死路。 – rattaman

回答

2

我在activemq論壇上問過,有人在那裏發佈了一個解決方案。這是一個答案solution at activemq forum。您可以使用XML實體,但必須禁用XML驗證,因此您必須從以下位置開始: bin/activemq start'xbean:conf/activemq.xml?validate = false'

0

這些真的是春天的配置問題

  • javax.management.InstanceAlreadyExistsException是當你 嘗試創建2種豆相同的名稱,所以在配置請 檢查,如果你想創建2種豆具有相同名稱引起的。
  • The matching wildcard is strict, but no declaration can be found for element 'xi:include' DDO尚未配置您的 命名空間時出現此錯誤(即「十一」是不是這個 Spring配置配置的命名空間,你需要明確定義它)
  • SAX parse exception一般是拋出當你的XML是不是以及 形成或它不堅持特定的DTD

希望這可以幫助!

祝你好運!

+0

謝謝你的回答。我意識到這些錯誤信息的含義,我不知道如何修改它們或找到另一種方法來做我想做的事情。 InstanceAlreadyExists - 是否有辦法讓兩個代理元素應用於同一個代理? xs:include - 我定義了命名空間,但顯然XML解析器不支持XInclude(這是一個死路,因爲我不想添加額外的依賴關係)。 SAX解析 - 根據我的理解,它應該沒問題,但是我沒有定義XML實體的任何經驗,所以也許有人可以告訴我,我做錯了什麼。 – rattaman

+0

爲此你需要發佈整個代碼,沒有它,我們無法從這裏檢測到問題 – Vihar

+0

@Vihar,你爲什麼不能根據OP已發佈的內容來看問題?這似乎很清楚...... – Tim

0

我想自己做這件事,但還沒有時間去嘗試,所以我希望你會找到一種方法來使它工作。

我想出的唯一想法是嘗試使用Spring的繼承特性來聲明一個具有通用元素/屬性和子類bean(帶有parent=superClassBeanID)的超類bean,該類提供了非標準的類。請注意,這種方法不需要多個文件;在同一個文件中定義這兩個bean,所以你不必擔心這個特定的問題。

即使它起作用,這種方法也不會讓您覆蓋第一級以下的屬性和元素,但它可能足夠滿足您的需求。正如我所說,我沒有試圖去測試這個,所以它可能會慘敗。

+0

那麼,我需要使用現有的配置架構,它使用自定義元素,所以我不認爲它會工作。謝謝您的回答。 – rattaman

+0

太糟糕了;我不停地檢查一下,看看你是否發佈了一個解決方案,希望你找到了一種方法來讓它工作,以便我可以做同樣的事情。 – Tim

+0

我在activemq論壇上問過,有人在那裏發佈了一個解決方案。這是一個答案。 [link](http://activemq.2283324.n4.nabble.com/Split-ActiveMQ-broker-configuration-into-multiple-files-tp4690947。htm) 您可以使用XML實體,但必須禁用XML驗證,因此您必須從以下位置開始: 'bin/activemq start'xbean:conf/activemq.xml?validate = false'' – rattaman

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(它不能解析像'&destinationpolicy;'這樣引入的XML元素)。幸運的是,這個腳本實際上只對端口(它可以從ENV獲得!)感興趣,所以快速解決方案/黑客就是在解析XML之前剝去頑皮的線。

相關問題