我有一个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;
}
}
如果您可以静态地创建它们,您可以像现在一样创建bean(每个bean都有一个唯一的限定符),但是您可以通过使用<code>@Autowired List在服务/组件中动态地访问它们
在Map实现中,String
将是限定符值。
如果您还想基于某些属性等动态创建bean,则会变得更加复杂。您将需要研究一些类似于在运行时实例化bean的东西
使用 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