2

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

我使用 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 属性,它也会尝试通过密码规范获取密码套件......

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

4

2 回答 2

1

此错误在此处得到确认:http ://www-01.ibm.com/support/docview.wss?uid=swg1IV36662

并在 Websphere MQ 修订包 7.1.0.3 中标记为已修复。

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

于 2017-02-07T10:54:59.907 回答
0

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

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

当然,这不是解决问题的首选方法,但目前这是我可以解决的唯一方法。

于 2013-07-24T08:38:06.410 回答