简而言之,我想在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(未知来源)
我有一个用JSR-352(在wildfly上使用jberet)实现的批处理。
我有一个项目计数为15的块,并java.lang.Exception配置为可重试和可跳过的异常。
当有很多例外时,大多数项目将被多次处理。在这种极端情况下,所有项目都会在编写器中引发异常:
此时,由于没有成功的已处理项目,因此仍然没有检查点。因此,读者再次从第一项开始。所有30个项目的item-count = 1等。
如果存在许多此类失败,则批次将一次又一次地处理所有项目。
我认为也需要为跳过的项目设置检查点,因为跳过的项目不应该再次处理。
我认为这是规范中的错误,所以我已经在那打开了一个问题:https : //github.com/WASdev/standards.jsr352.batch-spec/issues/15 还是我错了,并且误解了实现?
在Spring Batch中如何实现?
在我的JBeret Java批处理作业中,我需要将参数从一个步骤传递到下一步。到目前为止,我只是想通过JobContext.setTransientUserData()做到这一点。
我的问题是:transientUserData方法是最佳实践方法还是有更好的替代方法?在批处理步骤之间传递参数是普遍的,还是在这方面应该自给自足的步骤?