【问题标题】:IBM MQ and Spring Integration - security settingsIBM MQ 和 Spring 集成 - 安全设置
【发布时间】:2019-09-22 14:56:57
【问题描述】:

我有一个 Spring Integration 流,它使用入站网关从 IBM MQ 队列获取消息:

<int-jms:inbound-gateway id="InputGateway"  
   request-destination="RequestQueue"  
         request-channel="RequestChannel"
         reply-channel="ReplyChannel"     
         />

但是我无法指定安全设置。特别是,我需要一个用户名、密码和 userAuthenticationMQCSP = false(由于本文范围之外的原因,我不会详细介绍,但我的代理将抛出 MQRC = 2009 否则)。

我已经关注IBM guide to connect with jmsTemplate 并且工作正常。这使用了官方的Spring boot starter from IBM MQ,它将创建一个连接工厂,并使用 application.properties 中的一些默认值自动配置它:

ibm.mq.queueManager=myQMName
ibm.mq.channel=myChannel
ibm.mq.connName=myhostname(myPort)
ibm.mq.user=username
ibm.mq.password=*******
ibm.mq.userAuthenticationMQCSP=false

现在,回到 Spring 集成案例。根据int-jms:inbound-gateway spec,将向网关注入connectionFactory,名称(属性:connection-factory)默认设置为“jmsConnectionFactory”

默认情况下,所有需要引用 ConnectionFactory 自动查找名为 jmsConnectionFactory。这就是为什么您看不到连接工厂 许多例子中的属性。但是,如果您的 JMS ConnectionFactory 具有不同的 bean 名称,您需要提供该名称 属性。

我看不到任何方法可以为连接工厂设置可预测的名称,我可以将其插入 int-jms:inbound-gateway。

现在,根据this example,采用不同的方法,我已经创建了我的connectionFactory,并使用了一个合适的名称:

<bean id="jmsConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
     <property name="transportType" value="1"/>
     <property name="queueManager" value="myQMName"/>
     <property name="hostName" value="myhostname"/>
     <property name="port" value="myPort" />
     <property name="channel" value="myChannel"/>
</bean>

但现在我需要在某个地方放置凭据和安全参数。看上面的例子,看起来我需要插入类似的东西:

<bean id="secureJmsConnectionAdapter" class="**yourpackages.SecureJMSConnectionAdapter**">
    <property name="targetConnectionFactory" ref="${jms.mq.connection.factory}" />
    <property name="userName" value="${jms.username}"/>
    <property name="pwdAlias" value="${jms.alias}"/>
</bean>

但是我不清楚如何实现这个 SecureJMSConnectionAdapter。

另外,如果我建立自己的连接工厂,由于MQAutoConfiguration class 上的这个注释,我将失去所有 MQ 引导启动器自动功能:

@ConditionalOnMissingBean(value=javax.jms.ConnectionFactory.class)

关于如何将这些部分组合在一起的任何想法?

编辑:为了避免对任何人造成任何可能的红鲱鱼,MQRC2009 与 ibm.mq.userAuthenticationMQCSP=false 无关。

【问题讨论】:

    标签: java spring spring-integration ibm-mq


    【解决方案1】:

    在我的一些旧项目中,我使用了这样的 bean:

    <bean id="jmsQueueConnectionFactory"
          class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
        <property name="targetConnectionFactory" ref="jmsConnectionFactory"/>
        <property name="username" value="${jms.username}"/>
        <property name="password" value="${jms.alias}"/>
    </bean>
    

    应该可以很好地作为com.ibm.mq.jms.MQQueueConnectionFactory 的包装器,但您必须在目标组件中使用这个jmsQueueConnectionFactory

    虽然看起来提到的 IBM MQ JMS Spring 对我们来说并不能正确地公开 jmsConnectionFactory bean。在这种情况下,您可以依赖 Spring Integration 的默认值,或者将 jmsConnectionFactory 显式用于 connection-factory

    同样使用 Spring Boot,您应该考虑放弃 XML 配置,并为 Spring Integration Java DSL 提供机会:https://docs.spring.io/spring-integration/docs/5.1.7.RELEASE/reference/html/#java-dsl

    【讨论】:

    • 谢谢!这就是我想要的。
    猜你喜欢
    • 2020-04-02
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2018-02-08
    • 2018-06-27
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多