0

我正在迁移到 ActiveMQ 5.8.0 并有一个主从 ActiveMQ 设置。

这是我的 activemq.xml:

<!-- 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/activemq.properties</value>
    </property>      
</bean>

<!-- 
    The <broker> element is used to configure the ActiveMQ broker. 
-->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="${broker.name}" dataDirectory="${activemq.base}/data" destroyApplicationContextOnStop="true">


    <destinationPolicy>
        <policyMap>
          <policyEntries>
            <policyEntry topic=">" producerFlowControl="true" memoryLimit="1mb">
              <pendingSubscriberPolicy>
                <vmCursor />
              </pendingSubscriberPolicy>
            </policyEntry>
            <policyEntry queue="NotificationQueue" producerFlowControl="true" memoryLimit="64mb" queuePrefetch="200" >
              <!-- Use VM cursor for better latency
                   For more information, see:

                   http://activemq.apache.org/message-cursors.html

              <pendingQueuePolicy>
                <vmQueueCursor/>
              </pendingQueuePolicy>
              -->
            </policyEntry>
            <policyEntry queue="ReportingQueue" producerFlowControl="true" memoryLimit="10mb" queuePrefetch="200" >
             </policyEntry>
          </policyEntries>
        </policyMap>
    </destinationPolicy> 

    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>

    <persistenceAdapter>
        <jdbcPersistenceAdapter dataSource="#oracle-ds" useDatabaseLock="true" lockAcquireSleepInterval="10000" lockKeepAlivePeriod="10000" databaseLocker="#custom-locker" createTablesOnStartup="false"/>           
    </persistenceAdapter>


    <systemUsage>
        <systemUsage sendFailIfNoSpaceAfterTimeout="30000">
        <!--<systemUsage>-->
            <memoryUsage>
                <memoryUsage limit="128mb"/>
            </memoryUsage>
            <!--<storeUsage>
                <storeUsage limit="1 gb" name="foo"/>
            </storeUsage>
            <tempUsage>
                <tempUsage limit="100 mb"/>
            </tempUsage>-->
        </systemUsage>
    </systemUsage>

    <transportConnectors>
        <transportConnector name="openwire" uri="${connection.uri}"/>
    </transportConnectors>

</broker>

<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${database.driver.class.name}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
<property name="initialSize" value="${initialSize}"/>
<property name="minIdle" value="${minIdle}"/>
<property name="defaultAutoCommit" value="${defaultAutoCommit}"/>
<property name="defaultReadOnly" value="${defaultReadOnly}"/>
<property name="maxActive" value="${maxActive}"/>
<property name="maxIdle" value="${maxIdle}"/>
<property name="poolPreparedStatements" value="${poolPreparedStatements}"/>
<property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}"/>
<property name="maxWait" value="${maxWait}"/>
<property name="numTestsPerEvictionRun" value="${numTestsPerEvictionRun}"/>
<property name="testOnBorrow" value="${testOnBorrow}"/>
<property name="testOnReturn" value="${testOnReturn}"/>
<property name="testWhileIdle" value="${testWhileIdle}"/>
<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}"/>
<property name="validationQuery" value="${validationQuery}"/>
</bean>

<bean id="custom-locker" class="com.symantec.cda.activemq.failover.AMQCustomFailover">
    <property name="lockKeepAlivePeriod" value="10000" />
</bean>

<import resource="jetty.xml"/>

在 CLI 上同时启动 master 和 slave 时,出现以下异常:

java.sql.SQLSyntaxErrorException: ORA-00904: "XID": invalid identifier

at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:91)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1030)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:785)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:860)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3381)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3425)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1490)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.activemq.store.jdbc.adapter.DefaultJDBCAdapter.doRecoverPreparedOps(DefaultJDBCAdapter.java:957)
at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.recover(JDBCPersistenceAdapter.java:728)
at org.apache.activemq.store.jdbc.JdbcMemoryTransactionStore.recover(JdbcMemoryTransactionStore.java:160)
at org.apache.activemq.broker.TransactionBroker.start(TransactionBroker.java:97)
at org.apache.activemq.broker.BrokerService$5.start(BrokerService.java:2078)
at org.apache.activemq.broker.BrokerService.doStartBroker(BrokerService.java:636)
at org.apache.activemq.broker.BrokerService.startBroker(BrokerService.java:617)
at org.apache.activemq.broker.BrokerService.start(BrokerService.java:553)
at org.apache.activemq.xbean.XBeanBrokerService.afterPropertiesSet(XBeanBrokerService.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1581)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1522)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:605)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:64)
at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:52)
at org.apache.activemq.xbean.XBeanBrokerFactory$1.<init>(XBeanBrokerFactory.java:101)
at org.apache.activemq.xbean.XBeanBrokerFactory.createApplicationContext(XBeanBrokerFactory.java:101)
at org.apache.activemq.xbean.XBeanBrokerFactory.createBroker(XBeanBrokerFactory.java:65)
at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:71)
at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:54)
at org.apache.activemq.console.command.StartCommand.startBroker(StartCommand.java:125)
at org.apache.activemq.console.command.StartCommand.runTask(StartCommand.java:101)
at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
at org.apache.activemq.console.command.ShellCommand.runTask(ShellCommand.java:150)
at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
at org.apache.activemq.console.command.ShellCommand.main(ShellCommand.java:104)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.activemq.console.Main.runTaskClass(Main.java:262)
at org.apache.activemq.console.Main.main(Main.java:115)

错误 | 无法启动 Apache ActiveMQ (master, ID:symc-trustgateway-phy-be-51497-1366373603849-0:1)。原因:java.io.IOException:无法从:org.apache.activemq.store.jdbc.JdbcMemoryTransactionStore@5e0eb724 恢复。原因:java.sql.SQLSyntaxErrorException:ORA-00904:“XID”:标识符无效

我更改了我的 activemq.xml 以在其中硬编码 DB 详细信息(而不是从 activemq.properties 文件中引用)。所以 dataSource 属性现在指向这个:

<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@10.141.148.225:1521:CDAQA3"/>
    <property name="username" value="cdaapps"/>
    <property name="password" value="password"/>
    <property name="initialSize" value="${initialSize}"/>
    <property name="minIdle" value="${minIdle}"/>
    <property name="defaultAutoCommit" value="${defaultAutoCommit}"/>
    <property name="defaultReadOnly" value="${defaultReadOnly}"/>
    <property name="maxActive" value="${maxActive}"/>
    <property name="maxIdle" value="${maxIdle}"/>
    <property name="poolPreparedStatements" value="${poolPreparedStatements}"/>
    <property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}"/>
    <property name="maxWait" value="${maxWait}"/>
    <property name="numTestsPerEvictionRun" value="${numTestsPerEvictionRun}"/>
    <property name="testOnBorrow" value="${testOnBorrow}"/>
    <property name="testOnReturn" value="${testOnReturn}"/>
    <property name="testWhileIdle" value="${testWhileIdle}"/>
    <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}"/>
    <property name="validationQuery" value="${validationQuery}"/>
</bean>

仍然发生相同的异常。

4

1 回答 1

1

在迁移到 ActiveMQ 5.8.0 时,下面的 sql 应该处理上述异常

ALTER TABLE ACTIVEMQ_MSGS Add  XID VARCHAR(250);
CREATE INDEX ACTIVEMQ_MSGS_XIDX ON ACTIVEMQ_MSGS (XID);
ALTER TABLE ACTIVEMQ_ACKS add  XID VARCHAR(250);
CREATE INDEX ACTIVEMQ_ACKS_XIDX ON ACTIVEMQ_ACKS (XID);
于 2017-01-06T19:45:12.530 回答