2013-07-23 148 views
2

我尝试通过Spring为WebSphere MQ开发测试客户端(Java Web应用程序)。用于WebSphere MQ的SSL Java客户端

我已经使用NULL_MD5密码规范为通道,队列管理器和连接工厂启用了SSL安全机制。

这是我的Spring配置文件:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-2.5.xsd 
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <context:annotation-config/> 

    <context:property-placeholder location="classpath:jms.properties"/> 

    <bean id="jmsFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory"> 
     <property name="hostName" value="${queue_hostname}"/> 
     <property name="queueManager" value="${queue_manager}"/> 
     <property name="channel" value="${queue_channel}"/> 
     <property name="port" value="${queue_port}"/> 
     <property name="transportType" value="1"/> 
     <property name="SSLCipherSuite" value="SSL_RSA_WITH_NULL_MD5"/> 
    </bean> 

    <bean id="sendDestination" class="com.ibm.mq.jms.MQQueue"> 
     <property name="baseQueueName"> 
      <value>queue.inbound</value> 
     </property> 
    </bean> 

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
     <property name="connectionFactory"> 
      <bean class="org.springframework.jms.connection.SingleConnectionFactory"> 
       <property name="targetConnectionFactory"> 
        <ref local="jmsFactory" /> 
       </property> 
      </bean> 
     </property> 
     <property name="defaultDestination"> 
      <ref bean="sendDestination" /> 
     </property> 
    </bean> 


    <bean id="messageListener" class="com.test.MessageListener" /> 

    <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory"> 
      <bean class="org.springframework.jms.connection.SingleConnectionFactory"> 
       <property name="targetConnectionFactory"> 
        <ref local="jmsFactory" /> 
       </property> 
      </bean> 
     </property> 
     <property name="destination" ref="sendDestination" /> 
     <property name="messageListener" ref="messageListener" /> 
    </bean> 

</beans> 

问题是,当我尝试连接到WebSphere MQ异常引发:

Caused by: org.springframework.context.ApplicationContextException: Failed to start bean 'jmsContainer'; nested exception is java.lang.AssertionError 
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:170) 
    at org.springframework.context.support.DefaultLifecycleProcessor.access$1(DefaultLifecycleProcessor.java:154) 
    at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:339) 
    at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:143) 
    at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:108) 
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:926) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:467) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:103) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1) 
    at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228) 
    at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124) 
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148) 
    ... 27 more 
Caused by: java.lang.AssertionError 
    at com.ibm.mq.jmqi.internal.CipherSpec.<init>(CipherSpec.java:53) 
    at com.ibm.mq.jmqi.JmqiUtils.toCipherSuite(JmqiUtils.java:325) 
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.parseCipherSpec(RemoteTCPConnection.java:1984) 
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.makeSocketSecure(RemoteTCPConnection.java:1838) 
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.connnectUsingLocalAddress(RemoteTCPConnection.java:810) 
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.protocolConnect(RemoteTCPConnection.java:1130) 
    at com.ibm.mq.jmqi.remote.impl.RemoteConnection.connect(RemoteConnection.java:710) 
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSessionFromNewConnection(RemoteConnectionSpecification.java:400) 
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSession(RemoteConnectionSpecification.java:299) 
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionPool.getSession(RemoteConnectionPool.java:164) 
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1595) 
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1223) 
    at com.ibm.mq.ese.jmqi.InterceptedJmqiImpl.jmqiConnect(InterceptedJmqiImpl.java:311) 
    at com.ibm.mq.ese.jmqi.ESEJMQI.jmqiConnect(ESEJMQI.java:337) 
    at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:346) 
    at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:6876) 
    at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:6254) 
    at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:285) 
    at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6189) 
    at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:120) 
    at com.ibm.mq.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:203) 
    at org.springframework.jms.connection.SingleConnectionFactory.doCreateConnection(SingleConnectionFactory.java:342) 
    at org.springframework.jms.connection.SingleConnectionFactory.initConnection(SingleConnectionFactory.java:288) 
    at org.springframework.jms.connection.SingleConnectionFactory.createConnection(SingleConnectionFactory.java:225) 
    at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:184) 
    at org.springframework.jms.listener.AbstractJmsListeningContainer.createSharedConnection(AbstractJmsListeningContainer.java:403) 
    at org.springframework.jms.listener.AbstractJmsListeningContainer.establishSharedConnection(AbstractJmsListeningContainer.java:371) 
    at org.springframework.jms.listener.DefaultMessageListenerContainer.establishSharedConnection(DefaultMessageListenerContainer.java:750) 
    at org.springframework.jms.listener.AbstractJmsListeningContainer.doStart(AbstractJmsListeningContainer.java:278) 
    at org.springframework.jms.listener.AbstractJmsListeningContainer.start(AbstractJmsListeningContainer.java:263) 
    at org.springframework.jms.listener.DefaultMessageListenerContainer.start(DefaultMessageListenerContainer.java:556) 
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:167) 
    ... 38 more 

奇怪的是,即使我设置SSLCipherSuite属性,它试图通过密码规范得到密码套件...

有人可以请建议如何解决这个问题吗?

回答

0

那么,经过一番研究后,问题出现在断言机制中。如果断言被禁用,一切正常。奇怪的是,即使断言失败,你也可以拥有一个完整的工作代码......而且很遗憾,我找不到设置密码规范的方法 - 只有密码套件设置器由MQQueueConnectionFactory类提供。

如果是weblogic服务器,则会在WLS_HOME/user_projects/domains/local-domain-name/bin/setDomainEnv.cmd(.sh)中验证名为'debugFlag'的参数。如果您将其设置为“true”,则应用程序将失败。或者,您可以在setDomainEnv.cmd(.sh)文件的末尾添加以下JAVA_OPTION:-da:com.ibm.mq ...。通过这种方式,您可以启用调试。

对于cource来说,解决问题并不是一个可取的方法,但现在它是我能解决这个问题的唯一方法。

1

这个bug在这里承认:http://www-01.ibm.com/support/docview.wss?uid=swg1IV36662

并标记为固定在WebSphere MQ修订包7.1.0.3。

推荐的(但不是完全令人满意的)解决方法是使用“-disableassertions”或“-da”禁用JRE命令行中的断言。

+0

这也意味着在这篇文章中遇到这个问题的任何人都将使用MQ的不受支持的版本,并且如果他们希望在Production中获得支持,应该着眼于升级。 –

+0

@ T.Rob 7.1已经支持到4月底:) – JoshMc

+0

高级读写困难时刻?我首先将它读作7.0.1.3。所以,是的,在接下来的几个月中某个时候会升级。虽然没有那么迫切,但比在有效期限之后发现它要好。 –