Spring Integration 可以在多服务器环境中使用吗

Posted

技术标签:

【中文标题】Spring Integration 可以在多服务器环境中使用吗【英文标题】:Can Spring Integration be used in Mutli Server Environment 【发布时间】:2022-01-24 06:42:42 【问题描述】:

我们可以使用 Spring Integration 来配置目录轮询文件吗 -

配置了 2 台服务器后,轮询发生在 1 台服务器上,相应的处理在两台服务器上进行分布式处理。

另外,我们可以在运行时切换任一服务器上的轮询吗?

编辑 - 尝试配置 JBDC MetaStore 并分别运行两个实例,能够轮询和处理但间歇性地得到 DeadLockLoserDataAccessException

下面的配置

@Bean
public MessageChannel fileInputChannel()
return new DirectChannel();


@Bean(PollerMetadata.DEFAULT_POLLER)
public PollerMetadata defaultPoller()
PollerMetadata pollermetadata = new PollerMetadata();
pollermetadata.setMaxMessagesPerPoll(-1);
pollermetadata.setTrigger(new PeriodicTrigger(1000));
return pollermetadata;


@Bean
@InBoundChannelAdapter(value = "fileInputChannel")
FileReadingMessageSource source = new FileReadingMessageSource();
source.setDirectory("Mylocalpath");
FileSystemPersistentAcceptOnceFileListFilter acceptOnce = new FileSystemPersistentAcceptOnceFileListFilter();
ChainFileListFilter<File> chainFilter = ChainFileListFilter(".*\\.txt"));
chainFilter.addFilter(acceptOnce);
source.setFilter(chainFilter);
source.setUseWatchService(true);
source.setWatchEvents(FileReadingMessageSource.WatchEventType.CREATE,FileReadingMessageSource.WatchEventType.MODIFY);
return source;


@Bean
public IntegrationFlow processFileFlow()
return IntegrationFlows.from("fileInputChannel")
.handle(service).get();

【问题讨论】:

我猜你的意思是在集群中运行。回答是,但您需要设置基础设施来执行此操作。 ***.com/questions/40662400/… 谢谢....会尝试的 【参考方案1】:

轻松实现分布式解决方案确实是 Spring Integration 的特性之一。您只需将消息传递中间件添加到集群基础架构中,并将所有节点连接到某个目的地以进行发送和接收。一个很好的例子可能是SubscribableJmsChannel,您可以简单地在应用程序上下文中声明它,并且集群的所有节点都将订阅此通道以从 JMS 队列中循环使用。哪个节点产生到这个通道已经无关紧要了。

在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/jms.html#jms-channel。

另一个类似的分布式通道示例是:AMQP、Kafka、Redis、ZeroMQ。

您还可以拥有一个共享消息存储并在QueueChannel 定义中使用它:https://docs.spring.io/spring-integration/docs/current/reference/html/system-management.html#message-store

不清楚您所说的“运行时轮询器”是什么意思,所以我建议您使用更多信息启动一个新的 SO 线程。

将规则视为指导:https://***.com/help/how-to-ask

【讨论】:

其实我并不想配置和使用JMS/Queue通道,我想配置这样的东西。分布式环境中的两台服务器 A 和 B。 (要轮询要处理的文件的目录)在运行时 - 单个服务器 (A/B) 应该轮询目录,并且任何连续的处理都应该在服务器 A 和 B 上分发。 如何在没有网络交互的情况下进行分发?如果单个服务器轮询,则只有那个可以处理。要让其他服务器参与进来,你需要通过网络发送一些东西。你的想法是什么? 是的....对于 HA,尝试在两台服务器上进行设置,配置 JDBC Meta Store,能够从两台服务器轮询文件,但在两者之间获得此异常 DeadLockLoserDataAccessException。似乎需要显式配置事务管理,我检查但找不到我们如何使用 Java Annotations 而不是 XML 配置它 请在您的问题中显示您的配置 更新了上面有问题的配置。请看一下

以上是关于Spring Integration 可以在多服务器环境中使用吗的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Integration:在异常时不发送Tcp服务器响应

如何使用 Spring Integration 发送 gcm xmpp 消息?

XMPP - Spring Integration:spring 应用程序是不是运行嵌入式 XMPP 服务器

Spring的Data Access/Integration(意思:整合,一体化)包含的模块

将消息发送到套接字端口并使用Spring Integration接收响应

Spring Integration XMPP - 如果 XmppConnectionFactoryBean 的属性 autoStartup 配置为 false,则无法向聊天服务器发送消息