我正在使用带有OpenCSV的Spring Batch
Tasklet来读取我的CSV文件。在问这个问题之前,我知道很多块,但是在以后的步骤中文件之间会进行交叉验证,因此我必须继续使用Tasklet。
我想做的是向我的报告步骤报告丢失的文件或解析错误。我不确定应该向下一步报告失败的正确方法。我有以下代码。
读取文件的第一步。
public class CsvBatchReader<T> implements Tasklet, StepExecutionListener {
private final Logger logger = LoggerFactory.getLogger(CsvBatchReader.class);
private List batch;
private final Class<T> clazz;
private Path path;
public CsvBatchReader(Class<T> clazz, Path path) {
this.clazz = clazz;
this.path = path;
}
@Override
public void beforeStep(StepExecution stepExecution) {
logger.info("Reader initialized - " + clazz.getSimpleName());
batch = new ArrayList();
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
logger.info("Reader ended - " + clazz.getSimpleName());
return ExitStatus.COMPLETED;
}
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws UnexpectedJobExecutionException {
logger.info("Reader execute - " + clazz.getSimpleName());
ICsvToBean csvToBean = new CsvToBean(clazz, path);
try {
batch = csvToBean.readCsv();
} catch(IOException ex) {
// error message being caught from my csvToBean class.
throw new UnexpectedJobExecutionException("Invalid file " + ex.getMessage());
}
return RepeatStatus.FINISHED;
}
}
报告步骤
我不确定如何传递异常消息,或者是否有定义的方法来传递故障消息而不使用步骤执行上下文。
public class CsvBatchReporting implements Tasklet, StepExecutionListener {
private final Logger logger = LoggerFactory.getLogger(CsvBatchCrossValidation.class);
private List errorMessages;
private List skippedInserts;
@Override
public void beforeStep(StepExecution stepExecution) {
logger.info("Reporting initialized");
ExecutionContext executionContext = stepExecution
.getJobExecution()
.getExecutionContext();
System.out.println("description " + stepExecution.getStatus());
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
logger.info("Reporting ended");
return ExitStatus.COMPLETED;
}
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
logger.info("Reporting execute");
//Email Error
return RepeatStatus.FINISHED;
}
}
作业配置
@Bean
public Job primaryCareJob(@Qualifier("reportingStep") Step reportingStep, @Qualifier("crossValidationStep") Step crossValidationStep) {
logger.info("Start PrimaryCare Job");
return jobs.get("primaryCareJob")
.start(readPrimaryCareStep()).on("FAILED").to(reportingStep)
.from(readPrimaryCareStep()).on("*").to(readPrimaryCareDetailStep())
.from(readPrimaryCareDetailStep()).on("FAILED").to(reportingStep)
.from(readPrimaryCareDetailStep()).on("*").to(processPrimaryCareStep())
.from(processPrimaryCareStep()).on("INVALID").to(reportingStep)
.from(processPrimaryCareStep()).on("*").to(processPrimaryCareDetailStep())
.from(processPrimaryCareDetailStep()).on("INVALID").to(reportingStep)
//Other steps
.from(reportingStep).on("*").end()
.from(reportingStep).on("*").fail()
.build()
.build();
}
我开始将工作模式更改为失败,而不是将其定义为无效,以获取异常以自动调用失败的步骤。在我的afterStep中,使用以下代码定义了我使用无效的其他步骤。
if(!errorMessages.isEmpty()) {
chunkContext.getStepContext().getStepExecution().setExitStatus(new ExitStatus("INVALID"));
}
如何从阅读器获取CSV异常消息以传递到我的报告步骤中,以便可以将其作为电子邮件发送?
我不确定如何传递异常消息,或者是否有定义的方法来传递故障消息而不使用步骤执行上下文。
您可以访问作业执行中上一步中引发的异常。这是一个例子:
import java.util.List;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class MyJob {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
public Step step1() {
return steps.get("step1")
.tasklet((contribution, chunkContext) -> {
System.out.println("hello");
throw new Exception("Boom!");
})
.build();
}
@Bean
public Step step2() {
return steps.get("step2")
.tasklet((contribution, chunkContext) -> {
JobExecution jobExecution = chunkContext.getStepContext().getStepExecution().getJobExecution();
StepExecution stepExecution = jobExecution.getStepExecutions().iterator().next(); // TODO properly get the stepExecution of the previous step
List<Throwable> failureExceptions = stepExecution.getFailureExceptions();
if (!failureExceptions.isEmpty()) {
Throwable throwable = failureExceptions.get(0);
System.out.println("Looks like step1 has thrown an exception: " + throwable.getMessage());
}
System.out.println("world");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Job job() {
return jobs.get("job")
.flow(step1())
.on("*").to(step2())
.build()
.build();
}
public static void main(String[] args) throws Exception {
ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);
JobLauncher jobLauncher = context.getBean(JobLauncher.class);
Job job = context.getBean(Job.class);
jobLauncher.run(job, new JobParameters());
}
}
该样本打印:
hello
Looks like step1 has thrown an exception: Boom!
world
显然,您需要确保在所有情况下步骤1都流至步骤2(因此定义了流程)。
希望这可以帮助。
FCM服务未向我的iOS应用程序发送消息。 > App CAN成功接收APNs令牌和实例ID令牌 App CAN使用推送通知实用程序利用. p8令牌在后台成功接收来自APN的推送 #2中使用的相同APNs密钥上传到Firebase控制台 应用程序无法接收Firebase控制台中Notification Composer发送的消息,也无法使用CURL请求接收消息。 应用程序在通过FCM发送时不显示任
好的,事情是这样的,我已经在Stackoverflow中问了几个与firebase相关的问题,即使没有任何答案,我还是设法让firebase工作,并收到了一系列通知。我真的不知道我做了什么使它工作,这是一个结合了很多东西。 (之前发布的相关问题:如何使用webpack将Firebase云消息传送到ReactJS项目中|ReactJS和Webpack不工作的Firebase FCM:我们无法注册默认
高层体系结构 JMS(生产者/消费者)<---->Artemis(STOMP)<---->Websocket-Broker-Relay-Service<---->STOMP-over-Websocket-client(生产者/消费者)
我一直在Eclipse中使用JUnit创建单元测试,我很清楚JUnit的基本原理。测试按应有的方式运行,现在是时候找到一种报告失败测试的好方法了。我在web上遇到的大多数例子都是使用某种构建的系统,如Ant、Maven或Hudson,在构建项目的同时运行测试,但在构建过程中不需要这种集成。测试应该能够独立于构建系统运行。最后,这些系统只需从JUnit获取信息,并将其放入一个漂亮的HTML布局中。
我试图使用cadence来代表用户编排几个微服务api调用。每个api调用都需要使用一个短期的JWT进行身份验证,以识别用户。我希望我将需要实现令牌刷新功能,但我仍然需要将用户身份传播到所有活动。推荐的方法是什么?上下文传播器合适吗?我应该只使用普通的旧输入吗? 谢谢。
我正在使用WerbLogic 10.3.5和Spring 3.0实现JMS队列。我有以下Spring配置: 我的消息创建代码如下所示: 我的听众是这样的: 消息被正确创建,侦听器的onMessage()方法被调用,但是如果逻辑失败,我抛出RuntimeException(),消息不会被重新传递。我尝试了上述代码的许多细微变化(例如设置SessionAcknowledgeMemodeName=SES
我陷入了死胡同。思想?
我能够在我的AppDelegate中使用此实现在应用中接收FCM令牌: 这很奇怪,因为我之前已经在另一个iOS应用程序上实现了FCM(虽然不太复杂),我检查了设置是否一致。 唯一的区别是这个应用程序有几个目标。 如果我得到FCM令牌,APN和Firebase之间的配置是否正确?我还可以尝试调试什么? 更新:我使用了一个curl来发送通知(如本文所述:https://firebase.googleb