0

永続的な組み込みブローカーを持つ同じマシンで、この 1 つのサービスの複数のインスタンス (個別の JVM) を開始する必要があります。すべての構成ファイルは事前に生成されており、サービスが開始される前にコンパイル時に変数置換が行われます。AMQ データ ディレクトリと KahaDB のロックを取得しようとしているいくつかのインスタンスで問題が発生しています。明らかに、最初のインスタンスはロックを正常に取得し、残りのインスタンスは失敗し続けています。

次のように設定する必要があります。

. . .
<amq:broker dataDirectory="${activemq.directory}/data" id="broker" persistent="true" useJmx="false" >
. . .

PropertyPlaceholderConfigurer を試してみましたが、理解したとおり、Spring 構成で指定されたファイルからプロパティをロードし、起動時にはすでに遅すぎます。Spring Expression Language を使用しようとしているので、最終的には次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jms="http://www.springframework.org/schema/jms"
       xmlns:amq="http://activemq.apache.org/schema/core"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                           http://www.springframework.org/schema/jms
                           http://www.springframework.org/schema/jms/spring-jms-3.0.xsd
                           http://activemq.apache.org/schema/core
                           http://activemq.apache.org/schema/core/activemq-core-5.5.0.xsd">


    <!--  Embedded ActiveMQ Broker         -->
    <amq:broker dataDirectory="#{systemProperties['activemq.directory']}/data" id="broker" persistent="true" useJmx="false" >
   ... 

コマンドラインで渡します

-Dactivemq.directory=<my-directory>

私が見るログで

 nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named '{systemProperties['activemq.directory']}/data' is defined

AMQ と Spring3 SpEL で何か不足しているように見えますか? 私が行方不明かもしれないと同じ考えをする他の解決策はありますか?

4

2 に答える 2

2

1. PropertyPlaceholderConfigurer を使用する場合、非常に厄介な (しかし少なくとも機能する) 解決策は、先頭に空白を入れることです。

<amq:broker useJmx="false" persistent="false">
  <amq:transportConnectors>
    <amq:transportConnector uri=" #{myconf.getConfigurationValue('JMS_URI')}" />
  </amq:transportConnectors>
</amq:broker>

myconf.properties: JMS_URI=tcp://localhost:0?daemon=false

2. 少なくともプロトコルを明示的に設定すると、それも機能することも興味深いことです。

<amq:broker useJmx="false" persistent="false">
  <amq:transportConnectors>
    <amq:transportConnector uri="tcp://#{myconf.getConfigurationValue('JMS_URI')}" />
  </amq:transportConnectors>
</amq:broker>

myconf.properties: JMS_URI=localhost:0?daemon=false

于 2012-06-13T13:56:49.577 に答える
0

私は単に古き良き PropertyPlaceholderConfigurer を使用し、SpEL表記を削除することになりました。それは魅力のように機能します。

于 2012-04-11T22:06:11.493 に答える