标签: java-batch

如何从请求中放入自定义范围/上下文(JobScoped - 自定义CDI范围)特定实例以使其可注入?

简而言之,我想在rest请求中放入自定义范围的Configuration类的特定实例.主要问题是自定义范围(JobScoped来自JBeret https://jberet.gitbooks.io/jberet-user-guide/content/custom_cdi_scopes/index.html)在工作开始后是合格的.我知道有可能在启动作业时添加属性,但我的Configuration类会聚集很多配置而且它非常复杂,所以将这些文件转换为Properties类会非常不舒服.

详情如下:

这是休息请求伪代码:

@Path("/job")
public class RunJob {

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/start")
public String startJob(@FormDataParam("file") InputStream uploadedInputStream) {
    JobOperatorImpl jobOperator = (JobOperatorImpl) BatchRuntime.getJobOperator();

    Configuration config = new Configuration(uploadedInputStream);
    Properties properties = new Properties();
    jobOperator.start(job, properties);
}
Run Code Online (Sandbox Code Playgroud)

我想要实现的是在Job的上下文中注入一些配置文件,如下所示:

public class MyReader implements ItemReader {

@Inject
private Configuration configFile;
}
Run Code Online (Sandbox Code Playgroud)

配置类如下所示:

@JobScoped
public class Configuration {
 // some flags, methods etc
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了Instance,Provider但在我的情况下不知道如何使用它们.事实上,我认为使用它们是不可能的,因为作业是通过名称来识别的,这些名称是动态的并且在运行时已知.


同时我发现了类似的情况: 我可以创建一个请求范围的对象并从任何地方访问它,并避免在JAX-RS中作为参数传递它吗?

但后来发生缺少上下文的问题.Job启动时有JobScoped上下文.根据上面的解决方案,我注释了Configuration作为RequestScoped,然后我收到了:

org.jboss.weld.context.ContextNotActiveException:WELD-001303:org.jboss的org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:689)中的作用域类型javax.enterprise.context.RequestScoped没有活动的上下文位于org.jboss.weld.bean.ContextualInstance.getIfExists的org.jboss.weld.bean.ContextualInstanceStrategy $ CachingContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:165)中的.weld.bean.ContextualInstanceStrategy $ DefaultContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:90) (ContextualInstance.java:63)org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:83)org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance(ProxyMethodHandler.java:125)配置$ Proxy $ _ $$ _ WeldClientProxy.toString(未知来源)

jax-rs java-ee cdi java-batch jberet

7
推荐指数
1
解决办法
2586
查看次数

如何在WebSphere Liberty Batch中配置事务超时?

  • javax.transaction.global.timeout的作用是什么?
  • 我是否需要在CheckpointAlgorithm中实现checkpointTimeout()方法 ?
  • 服务器配置级别上有什么吗?它如何与应用程序级别设置的内容交互?

java websphere-liberty java-batch jsr352

4
推荐指数
1
解决办法
4576
查看次数

JSR 352:如何从分区步骤的每个分区的写入器收集数据?

因此,我在写入数据库的步骤中有 2 个分区。我想记录每个分区写入的行数,得到总和,打印到日志中;

我正在考虑static在编写器中使用变量并使用步骤上下文/作业上下文将其放入afterStep()步骤侦听器中。然而,当我尝试时,我得到了null。我能够从close()Reader 中获取这些值。

这是正确的做法吗?或者我应该使用分区收集器/减速器/分析器?

我在 Websphere Liberty 中使用 java 批处理。我正在 Eclipse 中开发。

java-batch jsr352

4
推荐指数
1
解决办法
914
查看次数

Java批处理:如何将数据从一个步骤传递到另一步骤?

在我的JBeret Java批处理作业中,我需要将参数从一个步骤传递到下一步。到目前为止,我只是想通过JobContext.setTransientUserData()做到这一点。

我的问题是:transientUserData方法是最佳实践方法还是有更好的替代方法?在批处理步骤之间传递参数是普遍的,还是在这方面应该自给自足的步骤?

java java-ee java-batch jberet

3
推荐指数
1
解决办法
1034
查看次数

批处理是在 JavaEE Batch 中实现 ETL 步骤的正确方法吗?

我正在研究 Javaee Batch API (jsr-352),以测试使用此技术为我们自己的解决方案更改当前 ETL 工具的可行性。

我的目标是建立一份工作,在其中我:

  • 从步骤 1 中的数据源获取一些(虚拟)数据,
  • 来自步骤 2 中其他数据源的一些其他数据和
  • 在 step3 中合并它们。

我想处理每个项目而不是写入文件,而是将其发送到下一步。并且还存储信息以供进一步使用。我可以使用 batchlets 和jobContext.setTransientUserData().

我想我没有理解正确的概念:据我所知,JSR-352 适用于这种 ETL 任务,但它有两种类型的步骤:块和批处理。块是“三阶段步骤”,其中读取、处理和写入数据。Batchlets 是不是对数据上的每个项目都执行的任务,而是一次(如计算总数、发送电子邮件等)。

我的问题是,如果我考虑批次的定义,我的解决方案是不正确的。

如何使用 Javaee Batch API 实现这种 kinf od 作业?

java java-ee-7 java-batch jakarta-ee

3
推荐指数
1
解决办法
1136
查看次数