在研究Linux中断处理时,我发现Tasklets和SoftIRQ是执行"下半部分"(较低优先级工作)的两种不同方法.我理解这一点(非常真实的需要).
不同的是,SoftIRQ是重要的,而Tasklet则不是.同样的SoftIRQ可以在不同的CPU上运行,而Tasklets不是这种情况.
虽然我从表面上理解这一点,但我无法理解这两个特征的要求.在什么情况下我们可以使用这些设施?如何识别我现在应该使用Tasklets和SoftIRQs.
另外,Tasklets是在SoftIRQ上制作的?在我用LKML阅读的一本书中,有关删除Tasklets的争论.我完全搞砸了为什么要引入这样的功能?一些短视(没有冒犯意味着)?
任何关于此的指示都会有所帮助.
来自文档:
NDB tasklet是一段可能与其他代码并发运行的代码.如果你编写一个tasklet,你的应用程序可以像使用异步NDB函数一样使用它:它调用tasklet,它返回一个Future; 之后,调用Future的get_result()方法获取结果.
文档中的解释和示例对我来说真的很神奇.我可以使用它,但很难理解它.
例如:
以编程方式配置块的容错工作类型如下:
stepBuilders.get("step")
.<Partner,Partner>chunk(1)
.reader(reader())
.processor(processor())
.writer(writer())
.listener(logProcessListener())
.faultTolerant()
.skipLimit(10)
.skip(UnknownGenderException.class)
.listener(logSkipListener())
.build();
Run Code Online (Sandbox Code Playgroud)
诀窍是,通过添加"chunk",链转换为SimpleStepBuilder,它提供"faultTolerant"方法.
我的问题是如果你只有一个tasklet(没有读者,处理器,编写器)怎么做?
定义tasklet的工作方式如下:
stepBuilders.get("step")
.tasklet(tasklet())
.build();
Run Code Online (Sandbox Code Playgroud)
"tasklet"的使用切换到不提供"faultTolerant"方法的TaskletStepBuilder.因此,我认为没有办法如何定义像skipLimit这样的属性.
有任何想法吗?
我有一个 tasklet 将一些信息设置到我的 JobContext 中,另一个 tasklet 检查一些东西以了解我是否可以执行批处理中的后续步骤。如果我在我的工作流程中使用两个不同的步骤,这两个小任务都可以很好地工作,但我想在同一步骤中使用这两个小任务。
我尝试在批处理配置中添加两次“.tasklet(taskletName)”,如下所示:
return stepBuilderFactory.get("stepSettings").tasklet(taskletSettings).tasklet(taskletChecking).listener(executionContextListener).listener(stepExecutionListener).build();
Run Code Online (Sandbox Code Playgroud)
它不起作用:只执行了一个 tasklet(它似乎是第二个)。我在 spring 文档中什么也没看到;有没有办法做到这一点 ?或者 Spring 不允许在同一步骤中有多个 tasklet 吗?