IBM MQ 和 Spring 集成 - 安全设置
IBM MQ and Spring Integration - security settings
我有一个 Spring 集成流,它使用入站网关从 IBM MQ 队列获取消息:
<int-jms:inbound-gateway id="InputGateway"
request-destination="RequestQueue"
request-channel="RequestChannel"
reply-channel="ReplyChannel"
/>
但是我无法分配安全设置。特别是,我需要一个用户名、密码和 userAuthenticationMQCSP = false(出于超出此 post 范围的原因,我不会详细说明,但我的经纪人将抛出一个 MQRC = 2009 否则)。
我已经按照 IBM guide to connect with jmsTemplate and works just fine. This uses the official 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"
By default, all of the JMS adapters that require a reference to the
ConnectionFactory automatically look for a bean named
jmsConnectionFactory. That is why you do not see a connection-factory
attribute in many of the examples. However, if your JMS
ConnectionFactory has a different bean name, you need to provide that
attribute.
我看不出有什么方法可以为可以插入 int-jms:inbound-gateway 的连接工厂设置可预测的名称。
现在,根据 采取不同的方法,我创建了一个具有适当名称的 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 boot starter automagic
@ConditionalOnMissingBean(value=javax.jms.ConnectionFactory.class)
关于如何将这些部分组合在一起有什么想法吗?
编辑:为了避免对任何人造成任何可能的转移注意力,MQRC2009 与 ibm.mq.userAuthenticationMQCSP=false 无关。
我的一些旧项目使用了这样的 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 的默认设置,或者明确地为 connection-factory
.
使用 jmsConnectionFactory
还有 Spring 引导,你应该考虑放弃 XML 配置并给 Spring 集成 Java DSL 的机会:https://docs.spring.io/spring-integration/docs/5.1.7.RELEASE/reference/html/#java-dsl
我有一个 Spring 集成流,它使用入站网关从 IBM MQ 队列获取消息:
<int-jms:inbound-gateway id="InputGateway"
request-destination="RequestQueue"
request-channel="RequestChannel"
reply-channel="ReplyChannel"
/>
但是我无法分配安全设置。特别是,我需要一个用户名、密码和 userAuthenticationMQCSP = false(出于超出此 post 范围的原因,我不会详细说明,但我的经纪人将抛出一个 MQRC = 2009 否则)。
我已经按照 IBM guide to connect with jmsTemplate and works just fine. This uses the official 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"
By default, all of the JMS adapters that require a reference to the ConnectionFactory automatically look for a bean named jmsConnectionFactory. That is why you do not see a connection-factory attribute in many of the examples. However, if your JMS ConnectionFactory has a different bean name, you need to provide that attribute.
我看不出有什么方法可以为可以插入 int-jms:inbound-gateway 的连接工厂设置可预测的名称。
现在,根据
<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 boot starter automagic@ConditionalOnMissingBean(value=javax.jms.ConnectionFactory.class)
关于如何将这些部分组合在一起有什么想法吗?
编辑:为了避免对任何人造成任何可能的转移注意力,MQRC2009 与 ibm.mq.userAuthenticationMQCSP=false 无关。
我的一些旧项目使用了这样的 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 的默认设置,或者明确地为 connection-factory
.
jmsConnectionFactory
还有 Spring 引导,你应该考虑放弃 XML 配置并给 Spring 集成 Java DSL 的机会:https://docs.spring.io/spring-integration/docs/5.1.7.RELEASE/reference/html/#java-dsl