2009-06-30 206 views
2

我在爲我的ActiveMQ服務實現HA時遇到了一些困難。 現在,我已經正確實現了Active MQ的主/從代理,所以如果主服務器死了,從服務器會透明地接管消息傳遞。他們都共享一個Microsoft SQL數據庫來存儲消息。ActiveMQ服務故障轉移和數據庫故障轉移

我想添加另一級別的高可用性,確保數據庫鏡像。像這樣,如果主體DB服務器死亡,代理將切換到鏡像服務器。 我已經正確設置了鏡像。 (數據正確鏡像到輔助數據庫服務器)。

問題是數據庫故障轉移會混淆一切。

如您所知,ActiveMq代理的主/從HA的工作方式如下:主服務器獲取數據庫中的鎖,並且從服務器嘗試使用它。一旦主人死亡,它就釋放鎖,從屬者接管並且客戶端切換到新的。 數據庫鏡像存在問題。當我關閉主體數據庫服務器時,主機無法更新數據庫鎖定。 另一方面,從服務器無法取得主DB服務器的鎖時嘗試次服務器,當然他不能,因爲它處於鏡像狀態。

如果我不使用masterMQ的主/從HA(只有一個代理,那麼)數據庫鏡像的作品。

這裏是配置文件和日誌中的主站的:

<!-- 
    Licensed to the Apache Software Foundation (ASF) under one or more 
    contributor license agreements. See the NOTICE file distributed with 
    this work for additional information regarding copyright ownership. 
    The ASF licenses this file to You under the Apache License, Version 2.0 
    (the "License"); you may not use this file except in compliance with 
    the License. You may obtain a copy of the License at 

    http://www.apache.org/licenses/LICENSE-2.0 

    Unless required by applicable law or agreed to in writing, software 
    distributed under the License is distributed on an "AS IS" BASIS, 
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    See the License for the specific language governing permissions and 
    limitations under the License. 
--> 
<!-- START SNIPPET: example --> 
<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:amq="http://activemq.apache.org/schema/core" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
    http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd 
    http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd"> 

    <!-- Allows us to use system properties as variables in this configuration file --> 
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <value>file:${activemq.base}/conf/credentials.properties</value> 
     </property>  
    </bean> 

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="MASTER.IP" dataDirectory="${activemq.base}/data"> 

     <!-- Destination specific policies using destination names or wildcards --> 
     <destinationPolicy> 
      <policyMap> 
       <policyEntries> 
        <policyEntry queue=">" memoryLimit="5mb"/> 
        <policyEntry topic=">" producerFlowControl="false" memoryLimit="5mb"> 
        </policyEntry> 
       </policyEntries> 
      </policyMap> 
     </destinationPolicy> 

     <!-- Use the following to configure how ActiveMQ is exposed in JMX --> 
     <managementContext> 
      <managementContext createConnector="false"/> 
     </managementContext> 

     <!-- The store and forward broker networks ActiveMQ will listen to --> 
     <networkConnectors> 
      <networkConnector 
       name="HA Queue" 
       uri="static:failover:(tcp://MASTER.IP:61616,tcp://SLAVE.IP:61616)" 
       /> 
     </networkConnectors> 

     <persistenceAdapter> 
      <amqPersistenceAdapter syncOnWrite="false" directory="${activemq.base}/data" maxFileLength="20 mb"/> 
     </persistenceAdapter> 

     <persistenceAdapter> 
       <journaledJDBC journalLogFiles="5" dataDirectory="../activemq-data" dataSource="#mssql-ds"/> 
     </persistenceAdapter> 

     <sslContext> 
      <sslContext keyStore="file:${activemq.base}/conf/broker.ks" keyStorePassword="password" trustStore="file:${activemq.base}/conf/broker.ts" trustStorePassword="password"/> 
     </sslContext> 

     <!-- The maximum about of space the broker will use before slowing down producers --> 
     <systemUsage> 
      <systemUsage> 
       <memoryUsage> 
        <memoryUsage limit="20 mb"/> 
       </memoryUsage> 
       <storeUsage> 
        <storeUsage limit="1 gb" name="foo"/> 
       </storeUsage> 
       <tempUsage> 
        <tempUsage limit="100 mb"/> 
       </tempUsage> 
      </systemUsage> 
     </systemUsage> 

     <!-- The transport connectors ActiveMQ will listen to --> 
     <transportConnectors> 
      <transportConnector name="openwire" uri="tcp://MASTER.IP:61616"/> 
      <transportConnector name="ssl" uri="ssl://MASTER.IP:61617"/> 
      <transportConnector name="stomp" uri="stomp://MASTER.IP:61613"/> 
      <transportConnector name="xmpp" uri="xmpp://MASTER.IP:61222"/> 
     </transportConnectors> 
    </broker> 

    <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring"> 

     <!-- You can use a <package> element for each root package to search for Java routes --> 
     <package>org.foo.bar</package> 

     <!-- You can use Spring XML syntax to define the routes here using the <route> element --> 
     <route> 
      <from uri="activemq:example.A"/> 
      <to uri="activemq:example.B"/> 
     </route> 
    </camelContext> 

    <!-- configure the camel activemq component to use the current broker --> 
    <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent" > 
     <property name="connectionFactory"> 
      <bean class="org.apache.activemq.ActiveMQConnectionFactory"> 
      <property name="brokerURL" value="vm://localhost?create=false&amp;waitForStart=10000" /> 
      <property name="userName" value="${activemq.username}"/> 
      <property name="password" value="${activemq.password}"/> 
      </bean> 
     </property> 
    </bean> 

    <!-- An embedded servlet engine for serving up the Admin console --> 
    <jetty xmlns="http://mortbay.com/schemas/jetty/1.0"> 
     <connectors> 
      <nioConnector port="8161"/> 
     </connectors> 

     <handlers> 
      <webAppContext contextPath="/admin" resourceBase="${activemq.base}/webapps/admin" logUrlOnStart="true"/> 
      <webAppContext contextPath="/demo" resourceBase="${activemq.base}/webapps/demo" logUrlOnStart="true"/> 
      <webAppContext contextPath="/fileserver" resourceBase="${activemq.base}/webapps/fileserver" logUrlOnStart="true"/> 
     </handlers> 
    </jetty> 

    <!-- MSSQL Setup --> 
    <bean id="mssql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> 
     <property name="url" value="jdbc:sqlserver://PRINCIPALDBSERVER;databaseName=activemq;instanceName=PRINCIPAL;user=activemq;password=activemq;failoverPartner=MIRRORDBSERVER\MIRROR"/> 
    </bean> 
</beans> 

和主輸出:

wrapper | --> Wrapper Started as Console 
wrapper | Launching a JVM... 
jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org 
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved. 
jvm 1 | 
jvm 1 | ACTIVEMQ_HOME: ..\.. 
jvm 1 | ACTIVEMQ_BASE: ..\.. 
jvm 1 | Loading message broker from: xbean:activemq.xml 
jvm 1 | INFO DefaultCamelContext   - JMX enabled. Using InstrumentationLifecycleStrategy. 
jvm 1 | INFO BrokerService     - Using Persistence Adapter: JournalPersistenceAdapator(JDBCPersistenceAdaptor([email protected])) 
jvm 1 | INFO JDBCPersistenceAdapter   - Database driver recognized: [microsoft_sql_server_2005_jdbc_driver] 
jvm 1 | INFO DefaultDatabaseLocker   - Attempting to acquire the exclusive lock to become the Master broker 
jvm 1 | INFO DefaultDatabaseLocker   - Becoming the master on dataSource: [email protected] 
jvm 1 | INFO BrokerService     - ActiveMQ 5.3-SNAPSHOT JMS Message Broker (MASTER.IP) is starting 
jvm 1 | INFO BrokerService     - For help or more information please see: http://activemq.apache.org/ 
jvm 1 | INFO JournalPersistenceAdapter  - Journal Recovery Started from: Active Journal: using 5 x 20.0 Megs at: C:\Documents and Settings\user\Desktop\apache-activemq-HA\bin\activemq-data\journal 
jvm 1 | INFO JournalPersistenceAdapter  - Journal Recovered: 0 message(s) in transactions recovered. 
jvm 1 | INFO TransportServerThreadSupport - Listening for connections at: tcp://MASTER.IP:61616 
jvm 1 | INFO TransportConnector    - Connector openwire Started 
jvm 1 | INFO TransportServerThreadSupport - Listening for connections at: ssl://MASTER.IP:61617 
jvm 1 | INFO TransportConnector    - Connector ssl Started 
jvm 1 | INFO TransportServerThreadSupport - Listening for connections at: stomp://MASTER.IP:61613 
jvm 1 | INFO TransportConnector    - Connector stomp Started 
jvm 1 | INFO TransportServerThreadSupport - Listening for connections at: xmpp://MASTER.IP:61222 
jvm 1 | INFO TransportConnector    - Connector xmpp Started 
jvm 1 | INFO DiscoveryNetworkConnector  - Establishing network connection from vm://MASTER.IP to failover:(tcp://MASTER.IP:61616,tcp://SLAVE.IP:61616) 
jvm 1 | INFO TransportConnector    - Connector vm://MASTER.IP Started 
jvm 1 | INFO FailoverTransport    - Successfully connected to tcp://MASTER.IP:61616 
jvm 1 | INFO NetworkConnector    - Network Connector HA Queue Started 
jvm 1 | INFO BrokerService     - ActiveMQ JMS Message Broker (MASTER.IP, ID:1487-1246351329984-0:0) started 
jvm 1 | INFO DemandForwardingBridge   - Disconnecting loop back connection. 
jvm 1 | INFO TransportConnector    - Connector vm://MASTER.IP Stopped 
jvm 1 | INFO DemandForwardingBridge   - MASTER.IP bridge to MASTER.IP stopped 
jvm 1 | INFO log       - Logging to org.slf4j.impl.JCLLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog 
jvm 1 | INFO log       - jetty-6.1.9 
jvm 1 | INFO WebConsoleStarter    - ActiveMQ WebConsole initialized. 
jvm 1 | INFO /admin       - Initializing Spring FrameworkServlet 'dispatcher' 
jvm 1 | INFO log       - ActiveMQ Console at http://0.0.0.0:8161/admin 
jvm 1 | INFO log       - ActiveMQ Web Demos at http://0.0.0.0:8161/demo 
jvm 1 | INFO log       - RESTful file access application at http://0.0.0.0:8161/fileserver 
jvm 1 | INFO log       - Started [email protected]:8161 
jvm 1 | WARN BrokerRegistry     - Broker localhost not started so using MASTER.IP instead 
jvm 1 | INFO TransportConnector    - Connector vm://localhost Started 
jvm 1 | ERROR DefaultDatabaseLocker   - Failed to update database lock: com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: socket write error 
jvm 1 | com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: socket write error 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1509) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSChannel.write(IOBuffer.java:1563) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSWriter.flush(IOBuffer.java:2422) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSWriter.writePacket(IOBuffer.java:2303) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSWriter.endMessage(IOBuffer.java:1910) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4327) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:369) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:322) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4003) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1550) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:160) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:133) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:290) 
jvm 1 | at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102) 
jvm 1 | at org.apache.activemq.store.jdbc.DefaultDatabaseLocker.keepAlive(DefaultDatabaseLocker.java:118) 
jvm 1 | at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.databaseLockKeepAlive(JDBCPersistenceAdapter.java:499) 
jvm 1 | at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter$1.run(JDBCPersistenceAdapter.java:201) 
jvm 1 | at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
jvm 1 | at java.util.concurrent.FutureTask$Sync.innerRunAndReset(Unknown Source) 
jvm 1 | at java.util.concurrent.FutureTask.runAndReset(Unknown Source) 
jvm 1 | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(Unknown Source) 
jvm 1 | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(Unknown Source) 
jvm 1 | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) 
jvm 1 | at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
jvm 1 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
jvm 1 | at java.lang.Thread.run(Unknown Source) 
jvm 1 | INFO JDBCPersistenceAdapter   - No longer able to keep the exclusive lock so giving up being a master 
jvm 1 | INFO BrokerService     - ActiveMQ Message Broker (MASTER.IP, ID:11487-1246351329984-0:0) is shutting down 
jvm 1 | INFO NetworkConnector    - Network Connector HA Queue Stopped 
jvm 1 | INFO TransportConnector    - Connector openwire Stopped 
jvm 1 | INFO TransportConnector    - Connector ssl Stopped 
jvm 1 | INFO TransportConnector    - Connector stomp Stopped 
jvm 1 | INFO TransportConnector    - Connector xmpp Stopped 
jvm 1 | ERROR JournalPersistenceAdapter  - Failed to checkpoint a message store: java.util.concurrent.ExecutionException: java.io.IOException: Connection reset by peer: socket write error 
jvm 1 | java.util.concurrent.ExecutionException: java.io.IOException: Connection reset by peer: socket write error 
jvm 1 | at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source) 
jvm 1 | at java.util.concurrent.FutureTask.get(Unknown Source) 
jvm 1 | at org.apache.activemq.store.journal.JournalPersistenceAdapter.doCheckpoint(JournalPersistenceAdapter.java:421) 
jvm 1 | at org.apache.activemq.store.journal.JournalPersistenceAdapter$1.iterate(JournalPersistenceAdapter.java:124) 
jvm 1 | at org.apache.activemq.thread.DedicatedTaskRunner.runTask(DedicatedTaskRunner.java:98) 
jvm 1 | at org.apache.activemq.thread.DedicatedTaskRunner$1.run(DedicatedTaskRunner.java:36) 
jvm 1 | Caused by: java.io.IOException: Connection reset by peer: socket write error 
jvm 1 | at org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:45) 
jvm 1 | at org.apache.activemq.store.jdbc.TransactionContext.getConnection(TransactionContext.java:61) 
jvm 1 | at org.apache.activemq.store.jdbc.TransactionContext.begin(TransactionContext.java:151) 
jvm 1 | at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.beginTransaction(JDBCPersistenceAdapter.java:397) 
jvm 1 | at org.apache.activemq.store.journal.JournalPersistenceAdapter.beginTransaction(JournalPersistenceAdapter.java:216) 
jvm 1 | at org.apache.activemq.util.TransactionTemplate.run(TransactionTemplate.java:41) 
jvm 1 | at org.apache.activemq.store.journal.JournalMessageStore.checkpoint(JournalMessageStore.java:258) 
jvm 1 | at org.apache.activemq.store.journal.JournalMessageStore.checkpoint(JournalMessageStore.java:233) 
jvm 1 | at org.apache.activemq.store.journal.JournalPersistenceAdapter$4.call(JournalPersistenceAdapter.java:391) 
jvm 1 | at org.apache.activemq.store.journal.JournalPersistenceAdapter$4.call(JournalPersistenceAdapter.java:389) 
jvm 1 | at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) 
jvm 1 | at java.util.concurrent.FutureTask.run(Unknown Source) 
jvm 1 | at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
jvm 1 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
jvm 1 | at java.lang.Thread.run(Unknown Source) 
jvm 1 | Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: socket write error 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1509) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSChannel.write(IOBuffer.java:1563) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSWriter.flush(IOBuffer.java:2422) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSWriter.writePacket(IOBuffer.java:2303) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSWriter.endMessage(IOBuffer.java:1910) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4327) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4310) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerConnection$1ConnectionCommand.doExecute(SQLServerConnection.java:1588) 
jvm 1 | at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4003) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1550) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectionCommand(SQLServerConnection.java:1593) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerConnection.setAutoCommit(SQLServerConnection.java:1746) 
jvm 1 | at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:331) 
jvm 1 | at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:317) 
jvm 1 | at org.apache.activemq.store.jdbc.TransactionContext.getConnection(TransactionContext.java:57) 
jvm 1 | ... 13 more 
jvm 1 | ERROR JournalPersistenceAdapter  - Could not stop service: JournalPersistenceAdapator(JDBCPersistenceAdaptor([email protected])). Reason: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed. 
jvm 1 | com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed. 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:130) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:294) 
jvm 1 | at com.microsoft.sqlserver.jdbc.SQLServerConnection.rollback(SQLServerConnection.java:1791) 
jvm 1 | at org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:328) 
jvm 1 | at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.rollback(PoolingDataSource.java:312) 
jvm 1 | at org.apache.activemq.store.jdbc.DefaultDatabaseLocker.stop(DefaultDatabaseLocker.java:107) 
jvm 1 | at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.stop(JDBCPersistenceAdapter.java:234) 
jvm 1 | at org.apache.activemq.store.journal.JournalPersistenceAdapter.stop(JournalPersistenceAdapter.java:281) 
jvm 1 | at org.apache.activemq.util.ServiceStopper.stop(ServiceStopper.java:41) 
jvm 1 | at org.apache.activemq.broker.BrokerService.stop(BrokerService.java:513) 
jvm 1 | at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.stopBroker(JDBCPersistenceAdapter.java:515) 
jvm 1 | at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.databaseLockKeepAlive(JDBCPersistenceAdapter.java:507) 
jvm 1 | at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter$1.run(JDBCPersistenceAdapter.java:201) 
jvm 1 | at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
jvm 1 | at java.util.concurrent.FutureTask$Sync.innerRunAndReset(Unknown Source) 
jvm 1 | at java.util.concurrent.FutureTask.runAndReset(Unknown Source) 
jvm 1 | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(Unknown Source) 
jvm 1 | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(Unknown Source) 
jvm 1 | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) 
jvm 1 | at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
jvm 1 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
jvm 1 | at java.lang.Thread.run(Unknown Source) 
jvm 1 | INFO BrokerService     - ActiveMQ JMS Message Broker (MASTER.IP, ID:11487-1246351329984-0:0) stopped 
jvm 1 | WARN JDBCPersistenceAdapter   - Failure occured while stopping broker 
wrapper | <-- Wrapper Stopped 

從站的配置文件:

<!-- 
    Licensed to the Apache Software Foundation (ASF) under one or more 
    contributor license agreements. See the NOTICE file distributed with 
    this work for additional information regarding copyright ownership. 
    The ASF licenses this file to You under the Apache License, Version 2.0 
    (the "License"); you may not use this file except in compliance with 
    the License. You may obtain a copy of the License at 

    http://www.apache.org/licenses/LICENSE-2.0 

    Unless required by applicable law or agreed to in writing, software 
    distributed under the License is distributed on an "AS IS" BASIS, 
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    See the License for the specific language governing permissions and 
    limitations under the License. 
--> 
<!-- START SNIPPET: example --> 
<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:amq="http://activemq.apache.org/schema/core" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
    http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd 
    http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd"> 

    <!-- Allows us to use system properties as variables in this configuration file --> 
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <value>file:${activemq.base}/conf/credentials.properties</value> 
     </property>  
    </bean> 

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="SLAVE.IP" dataDirectory="${activemq.base}/data"> 

     <!-- Destination specific policies using destination names or wildcards --> 
     <destinationPolicy> 
      <policyMap> 
       <policyEntries> 
        <policyEntry queue=">" memoryLimit="5mb"/> 
        <policyEntry topic=">" memoryLimit="5mb"/> 
       </policyEntries> 
      </policyMap> 
     </destinationPolicy> 

     <!-- Use the following to configure how ActiveMQ is exposed in JMX --> 
     <managementContext> 
      <managementContext createConnector="false"/> 
     </managementContext> 

     <!-- The store and forward broker networks ActiveMQ will listen to --> 
     <networkConnectors> 
      <networkConnector name="HA Queue" 
      uri="static:failover:(tcp://SLAVE.IP:61616,tcp://MASTER.IP:61616)"/> 
     </networkConnectors> 

     <persistenceAdapter> 
      <amqPersistenceAdapter syncOnWrite="false" directory="${activemq.base}/data" maxFileLength="20 mb"/> 
     </persistenceAdapter> 

     <persistenceAdapter> 
       <journaledJDBC journalLogFiles="5" dataDirectory="../activemq-data" dataSource="#mssql-ds"/> 
     </persistenceAdapter> 

     <sslContext> 
      <sslContext keyStore="file:${activemq.base}/conf/broker.ks" keyStorePassword="password" trustStore="file:${activemq.base}/conf/broker.ts" trustStorePassword="password"/> 
     </sslContext> 

     <!-- The maximum about of space the broker will use before slowing down producers --> 
     <systemUsage> 
      <systemUsage> 
       <memoryUsage> 
        <memoryUsage limit="20 mb"/> 
       </memoryUsage> 
       <storeUsage> 
        <storeUsage limit="1 gb" name="foo"/> 
       </storeUsage> 
       <tempUsage> 
        <tempUsage limit="100 mb"/> 
       </tempUsage> 
      </systemUsage> 
     </systemUsage> 


     <!-- The transport connectors ActiveMQ will listen to --> 
     <transportConnectors> 
      <!-- <transportConnector name="openwire" uri="tcp://10.216.1.52:61616" discoveryUri="multicast://default"/> --> 
      <transportConnector name="openwire" uri="tcp://SLAVE.IP:61616"/> 
      <transportConnector name="ssl" uri="ssl://SLAVE.IP:61617"/> 
      <transportConnector name="stomp" uri="stomp://SLAVE.IP:61613"/> 
      <transportConnector name="xmpp" uri="xmpp://SLAVE.IP:61222"/> 
     </transportConnectors> 

    </broker> 

    <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring"> 

     <!-- You can use a <package> element for each root package to search for Java routes --> 
     <package>org.foo.bar</package> 

     <!-- You can use Spring XML syntax to define the routes here using the <route> element --> 
     <route> 
      <from uri="activemq:example.A"/> 
      <to uri="activemq:example.B"/> 
     </route> 
    </camelContext> 

    <!-- configure the camel activemq component to use the current broker --> 
    <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent" > 
     <property name="connectionFactory"> 
      <bean class="org.apache.activemq.ActiveMQConnectionFactory"> 
      <property name="brokerURL" value="vm://localhost?create=false&amp;waitForStart=10000" /> 
      <property name="userName" value="${activemq.username}"/> 
      <property name="password" value="${activemq.password}"/> 
      </bean> 
     </property> 
    </bean> 

    <!-- An embedded servlet engine for serving up the Admin console --> 
    <jetty xmlns="http://mortbay.com/schemas/jetty/1.0"> 
     <connectors> 
      <nioConnector port="8161"/> 
     </connectors> 

     <handlers> 
      <webAppContext contextPath="/admin" resourceBase="${activemq.base}/webapps/admin" logUrlOnStart="true"/> 
      <webAppContext contextPath="/demo" resourceBase="${activemq.base}/webapps/demo" logUrlOnStart="true"/> 
      <webAppContext contextPath="/filese 

回答

0

請嘗試將用戶名和密碼添加到networkConnector。默認情況下,這是:

userName =「system」password =「manager」,經紀人不只是轉發沒有正確權限的消息和隊列。

+0

其實這也是一個非常有用的信息和平。與這個acticeMQ配置無關,但它解決了我的代理配置中的一個問題。非常感謝你 :) – srodriguez 2009-09-28 03:10:49