当前位置: 首页 > 知识库问答 >
问题:

Spring集成:通过配置连接到多个MQ服务器

苏季同
2023-03-14

我有一个Spring Boot 5应用程序,我也在一台IBM MQ服务器上运行它。

现在我们希望它连接到三个或更多 MQ 服务器。我现在的目的是将 XY 连接信息添加到环境中,然后我得到 XY MQConnectionFactory bean 和处理所需的所有其他 bean。

目前这是我所拥有的:

    @Bean
    @Qualifier(value="MQConnection")
    public MQConnectionFactory getIbmConnectionFactory() throws JMSException {
        MQConnectionFactory factory = new MQConnectionFactory();
// seeting all the parameters here

        return factory;
    }

但这是相当静态的。有没有一种优雅的方式来做到这一点?

我偶然发现了集成流。这可能是一个有效的解决方案吗?

谢谢你的小费!

KR。

基于Artem Bilan的回答,我创建了这个类。

@Configuration
public class ConnectionWithIntegrationFlowMulti {
    protected static final Logger LOG = Logger.create();
    
    @Value("${mq.queue.jms.sources.queue.queue-manager}")
    private String queueManager;


    @Autowired
    private ConnectionConfig connectionConfig;


    @Autowired
    private SSLSocketFactory sslSocketFactory;

    @Bean
    public MessageChannel queureader() {
        return new DirectChannel();
    }

    @Autowired
    private IntegrationFlowContext flowContext;
    
    @PostConstruct
    public void processBeanDefinitionRegistry() throws BeansException {

        Assert.notEmpty(connectionConfig.getTab().getLocations(), "At least one CCDT file locations must be provided.");
        for (String tabLocation : connectionConfig.getTab().getLocations()) {
            try {
                IntegrationFlowRegistration theFlow = this.flowContext.registration(createFlow(tabLocation)).register();
                LOG.info("Registered bean flow for %s with id = %s", queueManager, theFlow.getId());
            } catch (JMSException e) {
                LOG.error(e);
            }
        }
    }
    
    public IntegrationFlow createFlow(String tabLocation) throws JMSException {
        LOG.info("creating ibmInbound");
        return IntegrationFlows.from(Jms.messageDrivenChannelAdapter(getConnection(tabLocation)).destination(createDestinationBean()))
                .handle(m -> LOG.info("received payload: " + m.getPayload().toString()))
                .get();
    }

    
    public MQConnectionFactory getConnection(String tabLocation) throws JMSException {
        MQConnectionFactory factory = new MQConnectionFactory();
        
        // doing stuff
        
        return factory;
    }

    @Bean
    public MQQueue createDestinationBean() {
        LOG.info("creating destination bean");
        MQQueue queue = new MQQueue();

        try {
            queue.setBaseQueueManagerName(queueManager);
            queue.setBaseQueueName(queueName);

        } catch (Exception e) {
            LOG.error(e, "destination bean: Error for integration flow");
        }
        return queue;
    }


}

共有2个答案

阮桐
2023-03-14

如果您可以静态地创建它们,您可以像现在一样创建bean(每个bean都有一个唯一的限定符),但是您可以通过使用<code>@Autowired List在服务/组件中动态地访问它们

在Map实现中,String将是限定符值。

如果您还想基于某些属性等动态创建bean,则会变得更加复杂。您将需要研究一些类似于在运行时实例化bean的东西

贺劲
2023-03-14

使用 Spring 集成,您可以在运行时动态创建 IntegrationFlow 实例。为此,有一个 IntegrationFlowContext 及其 registration() API。返回的 IntegrationFlowRegistrationBuilder 作为回调,如下所示:

/**
     * Add an object which will be registered as an {@link IntegrationFlow} dependant bean in the
     * application context. Usually it is some support component, which needs an application context.
     * For example dynamically created connection factories or header mappers for AMQP, JMS, TCP etc.
     * @param bean an additional arbitrary bean to register into the application context.
     * @return the current builder instance
     */
    IntegrationFlowRegistrationBuilder addBean(Object bean);

因此,您的 MQConnectionFactory 实例可以与其他流一起填充,用作特定 JMS 组件中的引用,也可以注册为 bean

在文档中查看更多信息:https://docs . spring . io/spring-integration/docs/5 . 2 . 3 . release/reference/html/DSL . html # Java-DSL-runtime-flows

 类似资料:
  • 我一直在使用spring integration,我想连接多个ftp服务器来从远程位置检索文件,谁能给我一个好的例子,如何使用spring integration连接多个ftp服务器 先谢谢你,Udeshika

  • 从我的应用程序中,我需要配置多个需要连接到单个服务器的客户端连接。为此,我使用Application Context BeanFactory创建了可变数量的bean,具体取决于我配置了多少客户端。这是2个客户端的代码: 这是我的工厂方法: 当我运行程序时,两个客户端都连接到我的服务器。然而,一旦服务器将其第一个有效负载发送到每个客户端,我就会得到以下异常(每个客户端一个): 这个想法是数据将被读取

  • 我使用下面提到的连接URL连接到蜂巢服务器使用直线。 !连接jdbc: hive2://sandbox.hortonworks.com:21000/default; ssl=true; sslTrustStore=/var/lib/Knox/data-2.3.2.0-2950/Security/keystore/gateway.jks; Trust StorePassword=Knox?hive.

  • 然后我给出一个空白的用户名和密码,并得到以下错误: 有人能帮我接通吗

  • 关于上面的问题,我想请您帮忙。现在我正在尝试将应用程序(SpringCloudConfigServer)与另一个应用程序(limit-service)连接,limit-service应用程序必须选择SpringCloudConfigServer属性文件。当我点击http://localhost:8080/limits时,我需要像{“maximum”:888,“minimum”:8}一样获得oupp