ActiveMQ配置和Spring表达式语言(SpEL)

时间:2012-04-10 21:25:36

标签: java spring activemq

我必须在具有持久嵌入式代理的同一台机器上启动这一项服务的多个实例(单独的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的东西吗?还有其他一些解决方案,我认为可能会失踪吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我最终只使用了旧的PropertyPlaceholderConfigurer并删除了SpEL符号,它就像一个魅力。