Java批处理:jobContexttransientUserData未通过步骤

2023-11-29

我正在使用 jsr-352 规范的 JBeret 实现。

简而言之,这是我的工作配置:

<job id="expired-customer-cancellation" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd"
     version="1.0" jsl-name="job-parent" parent="job-parent">
    <step id="step1" next="step2">
        <chunk item-count="#{jobParameters['chunksize']}?:3">
            <reader ref="eccReader">
            </reader>
            <writer ref="eccWriter" />
        </chunk>
        <partition>
            <mapper ref="eccMapper">
                <properties>
                    <property name="threads" value="#{jobParameters['threads']}?:3"/>
                    <property name="records" value="#{jobParameters['records']}?:30"/>
                </properties>
            </mapper>
        </partition>
    </step>
    <step id="step2">
        <batchlet ref="eccMailBatchlet" />
    </step>
</job>

Itemwriter 类执行以下操作:

@Named
public class EccWriter extends AbstractItemWriter {

    @Inject
    Logger logger;

    @Inject
    JobContext jobContext;

    @Override
    public void writeItems(List<Object> list) throws Exception {
        @SuppressWarnings("unchecked")
        ArrayList<String> processed = Optional.ofNullable(jobContext.getTransientUserData()).map(ArrayList.class::cast).orElse(new ArrayList<String>());
        list.stream().map(UserLogin.class::cast).forEach(input -> {

            if (someConditions) {

                processed.add(input.getUserId());

            }
        });

        jobContext.setTransientUserData(processed); // update job transient data with processed list
    }
}

现在我希望在调用 jobContext.getTransientUserData() 时获得更新的列表step2,相反我得到的是null value.

此外,每个分区都有自己的 jobContext.transientUserData,因此它将始终以null分区开始时的值。

我认为 jobContext 本身可能会因其名称而误导常见错误。

在整个工作中传递一些数据的自然方式是什么?


这是当前 API 中的一个空白,我同意“线程本地”行为可能会令人惊讶。

您可以使用的一种技术是使用步骤持久用户数据。

例如。从步骤 1 开始:

StepExecution.setPersistentUserData(processed);

然后从步骤2开始:

@Inject 
JobContext ctx;

List<StepExecution> stepExecs = BatchRuntime.getJobOperator().getStepExecutions(ctx.getInstanceId());

// ... not shown here, but sort through stepExecs and find the one from step1.
StepExecution step2Exec = ... ;  

Serializable userData = step2Exec.getPersistentUserData()

之前已经指出这是一个需要改进的领域,并且应该在 Jakarta Batch(规范的新家)的未来增强中考虑这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java批处理:jobContexttransientUserData未通过步骤 的相关文章

随机推荐

  • 无法更改搜索栏背景颜色

    我有一个搜索栏 let searchBar UISearchBar UISearchBar frame CGRectMake searchView frame width UIScreen mainScreen bounds width 1
  • 如何在 PHP 中“打印”到论文上?

    我的意思是 假设我有一个内容 Stackoverflow 是最好的 bla bla bla 我想打印纸上的内容 而不是电脑显示器上的内容 该怎么做 我看到很多CMS用的是php 都有打印图标 能打印吗 好吧 我不是在创建 CMS 只是想知道
  • DNS服务器如何工作知道网站的IP地址?

    我的问题是假设我的网站是 xyz com 我可以在世界任何地方访问它 但我很好奇所有的 dns 服务器如何知道我网站的 IP 地址 我有点困惑 通过 DNS 解析 IP 地址的主要过程是引用 DNS 服务器将通过一个过程来查找您的域的权威名
  • CFLoop 缺少条目错误

    请忽略这篇文章 我在这里为我的问题做了一个更清楚的例子 条目丢失时 CFloop 出错 我正在运行下面的 CFLoop 代码
  • SignalR 无法在网站中工作,但可以在 Web 应用程序中工作

    我按照这个简单的tutorial并设法使用 signalR 创建一个测试 Web 应用程序 但是当我尝试使用 ASP NET 网站重新创建它 然后浏览 html 页面时 出现以下错误 TypeError connection is unde
  • Laravel 多对多 - ->select() 上设置意外结果

    我想知道是否有人可以提供帮助 因为我遇到了困难并且仍在学习 Laravel ORM 谁能解释一下为什么 当我跑步时 public function locationTags return this gt hasMany App UserHa
  • 通过 css 在 chrome 中实现灰度

    有没有办法通过 css 在 chrome 中制作灰度图像 我努力了this但不适用于最新版本的 chrome 从当前版本 19 0 1084 46 开始 添加了对 webkit 中原生 CSS 过滤器的支持 所以 webkit filter
  • 如何使用 INamingContainer 实现自定义面板?

    我正在尝试实现一个充当命名容器的自定义面板控件 到目前为止 这就是我所做的 首先这是我的自定义控件 MyPanel ToolboxData lt 0 MyPanel runat server gt public class MyPanel
  • Nullable 的装箱/拆箱行为如何可能?

    今天早些时候发生的一件事让我摸不着头脑 任何类型的变量Nullable
  • 如何从元组列表中删除重复项但保持原始顺序

    我想删除多余的元组但保留出现的顺序 我看了类似的问题 这个问题查找 numpy array 中唯一的行看起来很有希望 但不知何故它对我不起作用 我可以在这个答案中使用熊猫 https stackoverflow com a 14089586
  • char* 的写权限

    巧合的问题 需要能够修改 C 中 char 的内容 我有一个有点像这样的函数 char buffer char FUNCTION 现在我需要修改 缓冲区 例如做这样的事情 buffer 1 h 我尝试过的包括以下内容 char string
  • 具有多列的组合框

    设想 我正在将应用程序从访问权限移至 C 并且在其中一个表单 在访问权限中 上 用户可以选择一个包含 3 列 ID 名字 姓氏 的下拉列表 一旦他们从列表中选择 ID 就会显示在下拉列表中 问题 是否可以使用组合框重新创建此功能 您可以建议
  • 为相关标签搜索设置MYSQL数据库的正确方法?

    有人在我的网站上上传艺术作品 他们输入标题 标签和文件 上传后 我会标记标题 用逗号分隔的标记以及转换后的图像文件的文件路径 我现在想通过标签找到与此最接近的相关艺术 因此 为了找到最接近的匹配 我必须分解标签并搜索每个单独的标签 看来服务
  • Groupby 值依赖于数据框 pandas

    我有以下数据框 df pd DataFrame 1 1 term1 1 2 term2 1 1 term1 1 1 term2 2 2 term3 2 3 term1 2 2 term1 columns id group term 我想将其
  • 使用 python 3.5 安装 cPickle

    这可能很愚蠢 但我无法安装cPickle使用 python 3 5 docker 镜像 Dockerfile FROM python 3 5 onbuild 要求 txt cpickle 当我尝试构建图像时 docker build t s
  • 在openCV中从boundingRect创建一个掩码

    假设我根据某些点得到了一个boundingRect 并将其存储到一个 Rect 对象中 我如何使用这些点并在 openCV 中创建掩模 也就是说 边界矩形之外的所有内容都被屏蔽 或设置为白色 我尝试了几种不同的方法 并且能够使用凸包使其工作
  • 使用 jquery $.ajax 和 php 上传文件

    我希望当用户使用 ajax 在输入文件中选择文件时异步上传文件 但接收调用的 php 返回索引未定义 jquery 代码如下 urlimatge change function var filename urlimatge val ajax
  • Scrapy:无法创建项目

    我在安装 scrapy 时遇到问题lxml但后来我在stackoverflow上找到了一些信息 根据这些信息我做了一个sudo easy install lxml有一些错误 我认为 scrapy 已安装 我做出这样的判断的原因是我拒绝做以下
  • 从 NumberPicker 获取 float/double

    我正在尝试https github com SimonVT android numberpicker图书馆和参考是https developer android com reference android widget NumberPick
  • Java批处理:jobContexttransientUserData未通过步骤

    我正在使用 jsr 352 规范的 JBeret 实现 简而言之 这是我的工作配置