java - ActiveMQ持久化: some troubles with AMQ Message Store

标签 java spring activemq

我正在继续学习ActiveMQ,有一些问题: 我读了很多 ActiveMQ 持久性引用和文档,并注意到一件事 - 默认消息存储(据我所知)是 AMQ 消息存储,可以通过这样的 XML 代码片段进行配置:

<broker ...>    
   ....
   <persistenceAdapter>
      <amqPersistenceAdapter directory="activemq-data/store" maxFileLength="10mb"/>
   </persistenceAdapter>
   ....
</broker>

但我有点困惑 - 当我查看 xml 架构 ( http://activemq.apache.org/schema/core/activemq-core.xsd ) 时,没有元素 amqPersistenceAdapter。难道我没明白什么吗? 所以很明显,当我运行我的应用程序时,会发生异常:

Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 44 in XML document from class path resource [config.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 44; columnNumber: 86; cvc-complex-type.2.4.a: Invalid content was found starting with element 'amq:amqPersistenceAdapter'. One of '{"http://activemq.apache.org/schema/core":jdbcPersistenceAdapter, "http://activemq.apache.org/schema/core":journalPersistenceAdapter, "http://activemq.apache.org/schema/core":kahaDB, "http://activemq.apache.org/schema/core":levelDB, "http://activemq.apache.org/schema/core":mKahaDB, "http://activemq.apache.org/schema/core":memoryPersistenceAdapter, "http://activemq.apache.org/schema/core":replicatedLevelDB, WC[##other:"http://activemq.apache.org/schema/core"]}' is expected.
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:399)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:452)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.jmsexamples.Main.main(Main.java:7)
Caused by: org.xml.sax.SAXParseException; lineNumber: 44; columnNumber: 86; cvc-complex-type.2.4.a: Invalid content was found starting with element 'amq:amqPersistenceAdapter'. One of '{"http://activemq.apache.org/schema/core":jdbcPersistenceAdapter, "http://activemq.apache.org/schema/core":journalPersistenceAdapter, "http://activemq.apache.org/schema/core":kahaDB, "http://activemq.apache.org/schema/core":levelDB, "http://activemq.apache.org/schema/core":mKahaDB, "http://activemq.apache.org/schema/core":memoryPersistenceAdapter, "http://activemq.apache.org/schema/core":replicatedLevelDB, WC[##other:"http://activemq.apache.org/schema/core"]}' is expected.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:437)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:325)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:458)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3237)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1796)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.emptyElement(XMLSchemaValidator.java:766)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:356)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:347)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:429)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
    ... 14 more

这是 Spring 配置:

<?xml version="1.0" encoding="UTF-8"?>
<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"
  xmlns:jms="http://www.springframework.org/schema/jms"
  xsi:schemaLocation="
        http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.1.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.xsd
    " >


    <bean 
            id="producer"
            class="com.jmsexamples.Producer">
        <property name="connectionFactory" ref="jmsFactory" />  
    </bean>

    <bean 
            id="consumer"
            class="com.jmsexamples.Consumer"> 
        <property name="connectionFactory" ref="jmsFactory" />      
    </bean>

    <bean id="jdbc_ds" 
                class="org.apache.commons.dbcp.BasicDataSource"
                destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/ActiveMq?relaxAutoCommit=true" />
        <property name="username" value="root" />
        <property name="password" value="" />
        <property name="poolPreparedStatements" value="true"/>
    </bean>

    <amq:connectionFactory id="jmsFactory" brokerURL="tcp://localhost:61616"/>

    <amq:queue id="queue" physicalName="message.queue" />

    <amq:broker id="msgBroker" persistent="true">
    <amq:persistenceAdapter>
       <amq:amqPersistenceAdapter directory="activemq-data/store" maxFileLength="10mb"/>
    </amq:persistenceAdapter>

    <amq:transportConnectors>
      <amq:transportConnector name="openwire" uri="tcp://localhost:61616" />
    </amq:transportConnectors> 

  </amq:broker>
</beans>

最佳答案

现在 ActiveMQ 默认使用 KahaDB 持久化适配器,旧的 amq 适配器已被弃用,新版本不再支持。您可以在 XML 中配置 KahaDB 的各个方面,基本元素如下所示:

  <broker brokerName="broker" ... >
     <persistenceAdapter>
       <kahaDB directory="activemq-data" journalMaxFileLength="32mb"/>
       </persistenceAdapter>
  </broker>

请参阅KahaDB page欲了解更多信息:

关于java - ActiveMQ持久化: some troubles with AMQ Message Store,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28268936/

相关文章:

java - 将序列化的 HTML 时间字段转换为 java.time.LocalTime

java - 通过 HttpClient 下载无法正常工作

java - Spring Security getPrincipal() 方法返回 anonymousUser

java - XStream 使用 getter 进行序列化

architecture - 发布/订阅消息中的本地队列与远程队列

与窗口大小成比例的 Java 组件 (JavaFX)

java - 如何在java中使用LinkedHashMap从sql server数据库填充下拉列表

spring - 应用表达式评估请求处理程序建议是否会抑制错误?

java - 通过 ActiveMQ 将字节数组作为属性发送

ActiveMQ 和 maxPageSize