`

Spring2.5,Activemq5.2整合遇到的问题以及解决方法

阅读更多

最近项目要用到JMS,因为用tomcat容器,所以采用了开源的ActiveMQ  消息中间件提供JMS支持。但是在spring2.5和activemq5.2集成的时候出现了点问题,首先列出activemq-import-beans.xml的内容:

<beans xmlns="http://www.springframework.org/schema/beans" 
  xmlns:amq="http://activemq.org/config/1.0"
  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.xsd
                                    http://activemq.org/config/1.0 http://activemq.apache.org/schema/core/activemq.xsd">

 运行测试程序出现以下异常:

Caused by: org.xml.sax.SAXParseException: TargetNamespace.1: Expecting namespace 'http://activemq.org/config/1.0', but the target namespace of the schema document is 'http://activemq.apache.org/schema/core'.
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:2525)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.constructTrees(XSDHandler.java:768)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:569)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.findSchemaGrammar(XMLSchemaValidator.java:2408)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1753)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:685)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2740)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:645)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:508)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:225)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)
	at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
	... 22 more

 

通过阅读异常信息发现时XSD名称空间不对,所以赶紧打开activemq-core-5.2.0.jar/META-INF/目录中的spring.schemas查看,发现"http\://activemq.apache.org/schema/core/activemq-core.xsd=activemq.xsd"

于是乎又打开activemq.xsd查个究竟,以下为activemq5.2的activemq.xsd文件一部分:

<xs:schema elementFormDefault='qualified'
           targetNamespace='http://activemq.apache.org/schema/core'
           xmlns:xs='http://www.w3.org/2001/XMLSchema'
           xmlns:tns='http://activemq.apache.org/schema/core'>

 

噢,原来目标名称空间不一致啊。于是赶紧去改activemq-import-beans.xml文件的配置,修改如下:

 

<?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:amq="http://activemq.apache.org/schema/core"  //这个地方很关键,amq对应的XSD名称空间名称要和activemq.xsd的一致
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.xsd"> 

 

呵呵,到这里以为问题已经搞定,但是运行测试后,又发现一个新的问题,异常信息如下:

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://activemq.apache.org/schema/core/activemq.xsd', because 1) could not find the document; 
               2) the document could not be read; 
               3) the root element of the document is not <xsd:schema>.

 

查看了异常信息后,发现可能是spring无法定位到http://activemq.apache.org/schema/core/activemq.xsd,于是又一次打开activemq-core-5.2.0.jar/META-INF的spring.schemas,内容如下:

http\://activemq.org/config/1.0=activemq.xsd
http\://activemq.org/config/1.0/1.0.xsd=activemq.xsd
http\://activemq.apache.org/schema/core=activemq.xsd
http\://activemq.apache.org/schema/core/activemq-core.xsd=activemq.xsd

 呵呵,发现问题了吗?初看没啥问题,但是仔细一看,噢,原来http\://activemq.apache.org/schema/core/activemq-core.xsd=activemq.xsd 与http://activemq.apache.org/schema/core/activemq.xsd 不匹配,呵呵,知道问题根源了,现在时解决办法,解决办法有两种:

第一种:修改activemq-import-beans.xml文件的“http://activemq.apache.org/schema/core/activemq.xsd ”这句为:http://activemq.apache.org/schema/core/activemq-core.xsd(这个就是activemq jar包中spring.schemas文件的最后一行,但是注意:http\://要改为http://)

 

第二种:在classpath目录中,新建META-INF/spring.schemas文件,然后增加一下内容:

http\://activemq.apache.org/schema/core/activemq-core.xsd=activemq.xsd

 这个时候重新运行测试,发现一切OK。哈。。

 

 

4
0
分享到:
评论
2 楼 wangjian5748 2009-07-13  
activemq网站太垃圾,通过http://activemq.apache.org/schema/core/activemq-core.xsd这个无法访问获得这个xsd文件,只有http://activemq.apache.org/schema/core/activemq-core-5.2.0.xsd才能获得这个文件,所以若按照您第一种方式修改的话,则在eclipse里无法使用xml编辑器自动提示的功能,最好使用第二种方式,并把内容改为http\://activemq.apache.org/schema/core/activemq-core-5.2.0.xsd=activemq.xsd,这样就可以利用eclipse的自动提示功能,因为eclipse会自动抓取这个url的xsd文件。
1 楼 kusix 2009-05-12  
非常感谢,根据你的文章解决问题了

相关推荐

    ActiveMQ5.1+Spring2.5 Demo

    在这个"ActiveMQ5.1+Spring2.5 Demo"中,我们将深入探讨如何在Spring 2.5版本中配置和使用ActiveMQ,以及如何构建一个简单的示例应用来演示其功能。 首先,让我们了解如何在Spring配置中设置ActiveMQ。在Spring的...

    Spring和ActiveMQ整合的完整实例

    将Spring与ActiveMQ整合,可以轻松地在Spring应用中实现消息队列的功能,提高系统的可扩展性和可靠性。 首先,让我们了解Spring框架如何支持消息传递。Spring提供了JmsTemplate类,这是一个模板类,用于简化发送和...

    Spring和ActiveMQ的整合实例源码

    在IT行业中,Spring框架是Java应用开发的基石,它提供了丰富的功能来简化应用程序的构建,包括依赖注入、AOP(面向切面编程)以及各种模块如数据访问、Web支持等。而ActiveMQ则是Apache软件基金会的一个开源项目,是...

    ActiveMQ-P2P文本消息+Spring和ActiveMQ的整合实例源码

    以上就是关于 ActiveMQ-P2P 文本消息以及 Spring 和 ActiveMQ 整合实例的相关知识点。通过这些知识,开发者可以构建起可靠的点对点消息传递系统,提高应用的可扩展性和解耦性。在实际项目中,根据具体需求,还可以...

    Spring+ActiveMQ的整合

    3. **Spring与ActiveMQ的整合**:整合Spring和ActiveMQ的主要目的是利用Spring的IoC(控制反转)和AOP特性,以及ActiveMQ的消息传递能力,实现应用间的高效通信。Spring提供了JmsTemplate类,这是一个用于发送和接收...

    spring整合Activemq源码

    本文将详细探讨Spring与ActiveMQ的整合过程,以及相关的知识点。 1. **Spring框架**:Spring是Java开发中的一个全功能框架,提供依赖注入(Dependency Injection)、面向切面编程(AOP)、事务管理等核心功能,广泛...

    spring 与ACTIVEMQ整合

    3. **Spring配置**:在Spring应用中整合ActiveMQ,首先需要在配置文件中引入ActiveMQ的JAR包,并配置连接工厂、目的地(队列或主题)以及消息监听器容器。 二、Spring整合ActiveMQ步骤 1. **添加依赖**:在项目中...

    activeMQ5.2的jar包及使用实例

    activeMQ5.2的jar包及使用实例,它既支持点到点(point-to-point)(PTP)模型和发布/订阅(Pub/Sub)模型。支持同步与异步消息发送。JDBC持久性管理使用数据库表来存储消息 。

    Spring与ActiveMQ整合完整案例

    本案例将详细讲解如何将Spring与ActiveMQ整合,以提升系统的可扩展性和解耦性。 1. **Spring框架**:Spring是一个全方位的开发框架,提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented ...

    Spring和ActiveMQ的整合实例源码ActiveMQSpringDemo.zip

    本实例"Spring和ActiveMQ的整合实例源码ActiveMQSpringDemo"提供了一个完整的解决方案,帮助开发者了解如何在Spring环境中集成ActiveMQ进行消息队列的使用。 首先,Spring是一个广泛使用的Java企业级应用开发框架,...

    Spring+ActiveMQ整合实例代码工程

    **Spring与ActiveMQ整合详解** 在Java开发中,Spring框架是极为重要的应用基础,而ActiveMQ作为Apache出品的一款开源消息中间件,常被用于实现应用间的异步通信和解耦。本实例代码工程"Spring+ActiveMQ整合实例代码...

    ActiveMQ 5.2指导手册

    手册的最后还提到了版权声明和免责声明,提醒用户在使用ActiveMQ时需要注意的法律事项,以及在使用中可能会遇到的风险和责任。这些声明确保了用户在使用ActiveMQ的过程中,对可能的风险有所了解,并承担相应的责任。

    spring整合activemq的maven工程

    现在,我们将深入探讨如何将Spring与ActiveMQ整合,并使用Maven进行项目构建。 首先,我们需要理解Spring与ActiveMQ整合的基本概念。Spring通过其`spring-jms`模块提供了对JMS的支持,可以方便地与消息代理如...

    Spring集成ActiveMQ配置

    Spring集成ActiveMQ配置详解 Spring框架与ActiveMQ的集成,为开发者提供了一种高效、可靠的JMS消息处理机制。在企业级应用中,这种集成能够极大地提升系统的响应速度和容错能力,特别是在需要异步通信和分布式事务...

    spring+activemq

    在IT行业中,Spring框架与ActiveMQ的结合是构建企业级应用中常见的消息中间件解决方案。Spring框架是一个开源的Java平台,它提供了丰富的功能,包括依赖注入、AOP(面向切面编程)、数据访问、Web应用以及更多的服务...

    Spring整合activemq

    整合Spring与ActiveMQ的过程涉及到了Java配置或XML配置、消息的生产和消费、以及可能的消息转换和错误处理策略。这种整合方式能够提升系统的可扩展性和可靠性,使得不同组件之间可以独立工作,通过消息传递进行通信...

    spring boot activemq整合例子

    将Spring Boot与ActiveMQ整合,可以充分利用Spring的自动化配置和ActiveMQ的消息传递能力,构建高效、可扩展的微服务架构。 本文将深入探讨如何在Spring Boot项目中集成ActiveMQ,包括以下几个关键知识点: 1. **...

    spring使用activeMQ实现消息发送

    在IT行业中,Spring框架是Java应用开发的基石,而ActiveMQ则是Apache组织开发的一款开源的消息中间件,用于处理异步通信和消息队列。本文将深入探讨如何在Spring环境中使用ActiveMQ来实现消息的发送与接收,以提高...

Global site tag (gtag.js) - Google Analytics