Spring 集成 DSL 关闭策略
Spring Integration DSL Shutdown Strategy
目前我有这个流程
package com.example.demo.flow;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.dsl.*;
import org.springframework.integration.dsl.channel.MessageChannels;
import org.springframework.integration.file.dsl.Files;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.concurrent.Executors;
/**
* Created by on 03/01/2020.
*/
@Component
@Slf4j
public class TestFlow {
@Bean
public StandardIntegrationFlow errorChannelHandler() {
return IntegrationFlows.from("testChannel")
.handle(o -> {
log.info("Handling error....{}", o);
}).get();
}
@Bean
public IntegrationFlow testFile() {
IntegrationFlowBuilder testChannel = IntegrationFlows.from(Files.inboundAdapter(new File("d:/input-files/")),
e -> e.poller(Pollers.fixedDelay(5000L).maxMessagesPerPoll(5)
.errorChannel("testChannel")))
.channel(MessageChannels.executor(Executors.newFixedThreadPool(5)))
.transform(o -> {
throw new RuntimeException("Failing on purpose");
}).handle(o -> {
});
return testChannel.get();
}
}
我计划因关闭而停止此流程,但流程中可能包含一些文件。
如果我关闭集成流程,当前正在处理的文件是否仍会完成,或者它们可能会停止并杀死它们的线程?
如果停止而不是销毁,过程中的一切都会得到妥善处理。只有新数据将从源或消息通道发出。当您关闭它时,这也是 ApplicationContext
的自然优雅关闭行为:它首先停止 beans 让它们完成正在进行的任何事情,然后才销毁它们。
因此,到目前为止,您的意图应该没问题。请与我们分享您的经验(如果有的话)- 如果需要,我们将尽快进行适当的修复。关键是停止阶段的目标确实是不发出新数据,但让现有处理正常完成。在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/system-management.html#jmx-shutdown
目前我有这个流程
package com.example.demo.flow;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.dsl.*;
import org.springframework.integration.dsl.channel.MessageChannels;
import org.springframework.integration.file.dsl.Files;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.concurrent.Executors;
/**
* Created by on 03/01/2020.
*/
@Component
@Slf4j
public class TestFlow {
@Bean
public StandardIntegrationFlow errorChannelHandler() {
return IntegrationFlows.from("testChannel")
.handle(o -> {
log.info("Handling error....{}", o);
}).get();
}
@Bean
public IntegrationFlow testFile() {
IntegrationFlowBuilder testChannel = IntegrationFlows.from(Files.inboundAdapter(new File("d:/input-files/")),
e -> e.poller(Pollers.fixedDelay(5000L).maxMessagesPerPoll(5)
.errorChannel("testChannel")))
.channel(MessageChannels.executor(Executors.newFixedThreadPool(5)))
.transform(o -> {
throw new RuntimeException("Failing on purpose");
}).handle(o -> {
});
return testChannel.get();
}
}
我计划因关闭而停止此流程,但流程中可能包含一些文件。 如果我关闭集成流程,当前正在处理的文件是否仍会完成,或者它们可能会停止并杀死它们的线程?
如果停止而不是销毁,过程中的一切都会得到妥善处理。只有新数据将从源或消息通道发出。当您关闭它时,这也是 ApplicationContext
的自然优雅关闭行为:它首先停止 beans 让它们完成正在进行的任何事情,然后才销毁它们。
因此,到目前为止,您的意图应该没问题。请与我们分享您的经验(如果有的话)- 如果需要,我们将尽快进行适当的修复。关键是停止阶段的目标确实是不发出新数据,但让现有处理正常完成。在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/system-management.html#jmx-shutdown