【问题标题】:Spring jms failing to connect to Websphere MQ - Resource ExceptionSpring jms 无法连接到 Websphere MQ - 资源异常
【发布时间】:2015-08-27 19:12:35
【问题描述】:

问题:在运行时获取资源异常尝试连接到 websphere mq 以使用 spring 获取 jms 消息。我只是无法确定我错过了什么?

说明: 尝试在此处设置示例。 Websphere MQ 的 Spring MDP 激活规范。

http://stackoverflow.com/questions/14523572/spring-jms-and-websphere-mq

Maven 依赖项 注意:ibm jar 的版本号看起来很奇怪,因为我在我的项目中创建了一个本地 repo 来添加 3rd 方库。我正在从本地 Websphere SDP 版本中获取 ibm jars for Websphere 7.5 。我也试过直接在STS spring包上添加jar依赖,同样报错。

Spring 配置 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:int="http://www.springframework.org/schema/integration"
    xmlns:int-jms="http://www.springframework.org/schema/integration/jms"
    xmlns:jms="http://www.springframework.org/schema/jms"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-4.1.xsd
        http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms-4.1.xsd
        http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.1.xsd">


     <bean id="messageListener" class="myproject.spring.integration.mq.SpringMdp" />  

     <bean id="messageListener" class="com.rohid.samples.SpringMdp" />  

     <bean class="org.springframework.jms.listener.endpoint.JmsMessageEndpointManager">
         <property name="activationSpec">
           <bean class="com.ibm.mq.connector.inbound.ActivationSpecImpl">
               <property name="destinationType" value="javax.jms.Queue"/>
               <property name="destination" value="QUEUE1"/>
               <property name="hostName" value="A.B.C"/>
                   <property name="queueManager" value="QM_"/>
               <property name="port" value="1414"/>
               <property name="channel" value="SYSTEM.ADMIN.SVNNN"/>
               <property name="transportType" value="CLIENT"/>
               <property name="userName" value="abc"/>
               <property name="password" value="jabc"/>
            </bean>
          </property>
          <property name="messageListener" ref="messageListener"/>
          <property name="resourceAdapter" ref="myResourceAdapterBean"/>
    </bean>

    <bean id="myResourceAdapterBean" org.springframework.jca.support.ResourceAdapterFactoryBean">
      <property name="resourceAdapter">
        <bean class="com.ibm.mq.connector.ResourceAdapterImpl">
          <property name="maxConnections" value="50"/>
        </bean>
      </property>
      <property name="workManager">
         <bean class="org.springframework.jca.work.SimpleTaskWorkManager"/>
      </property>
     </bean>
</beans>

堆栈跟踪:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.jms.listener.endpoint.JmsMessageEndpointManager#0' defined in class path resource [context.xml]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/resource/ResourceException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1101)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at myproject.spring.integration.mq.Main.main(Main.java:9)
Caused by: java.lang.NoClassDefFoundError: javax/resource/ResourceException
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
    at java.lang.Class.getConstructor0(Unknown Source)
    at java.lang.Class.getDeclaredConstructor(Unknown Source)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:80)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1094)
    ... 13 more
Caused by: java.lang.ClassNotFoundException: javax.resource.ResourceException
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 19 more

更新 - 解决方案:需要 IBM Jar 依赖项。

【问题讨论】:

    标签: spring-integration spring-jms


    【解决方案1】:

    通常,在 RAD 或其他 IBM 工具中为最终将部署到 WAS 的应用程序正确设置类路径的最简单方法是将 WAS 版本的服务器运行时库加载到您的应用程序中。

    这很容易。转到应用程序属性页面,转到构建路径,库选项卡,然后单击添加库。您将看到下面的屏幕截图。选择服务器运行时,只要您安装了正确的 WAS 版本作为 RAD 的一部分,您就会看到它们的运行时。

    这通常是最好的方法,因为它允许您将 WAS 库与您的应用程序分开,但仍使它们可用于编译。您可以做的最糟糕的事情是将 WAS 库嵌入到您的应用程序中。如果您这样做并将您的应用程序部署到不同版本的 WAS,那么您将得到奇怪的类路径或奇怪的运行时错误。最重要的是,在应用补丁包或其他软件调整后,正在运行的东西可能会停止运行。

    如果您添加服务器运行时库,那么这就是您的应用在 RAD 中的外观。

    【讨论】:

      【解决方案2】:

      看起来您在这里缺少一些依赖项。您可以尝试将javaee-api 添加到您的 pom 文件中吗?

      <dependency>
         <groupId>javax</groupId>
         <artifactId>javaee-api</artifactId>
         <version>6.0</version> <!-- or take version 7.0 if needed -->
      </dependency>
      

      【讨论】:

      • 感谢您的来信。我尝试了这个并得到了一个不同的错误,但我得到的错误提到你需要下载完整的 javaee jar。我将尝试打包在 websphere 中的那个。在类路径资源 [context.xml] 中定义名称为“org.springframework.jms.listener.endpoint.JmsMessageEndpointManager#0”的 bean 创建错误:bean 的实例化失败;嵌套异常是 java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/resource/ResourceException
      • 我也刚刚尝试使用来自 glashfish 的 JAVA EE7 SDK javaee jar。仍然出现资源异常。
      • 我从 IBM WebSphere 库中获取的缺少的关键 jar 是 j2ee.jar 。我为 mq 错过了其他几个 ibm 的,但是一旦我有了那个 j2ee.jar,我就可以追踪其他的。试图找到可以与 STS 一起使用的 j2ee.jar 的替代品。
      猜你喜欢
      • 2015-07-08
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2012-08-27
      • 2013-01-09
      • 1970-01-01
      相关资源
      最近更新 更多