【发布时间】:2020-01-25 22:30:47
【问题描述】:
我的输入是一个 csv 文件,如下所示:
USER_ID, USER_NAME, FREQUENCY, FREQUENCY_DETAIL
A123, AAA, ANNUALLY, 1-JUN
B123, BBB, INVALID_FREQUENCY, 21-JUN
C123, CCC, ANNUALLY, APR
D123, DDD, WEEKLY, 1-DEC
验证:
USER_ID -> alphanumeric
USERNAME -> alphabets only
FREQUENCY -> must be one of DAILY, WEEKLY, MONTHLY , ANNUALLY
FREQUENCY DETAIL -> Pattern \\d{1,2}-\\w{3}
我的 Bean 如下:
class UserBean {
String userID;
String userName;
String frequency;
String frequencyDetail;
String status = "SUCCESS"; //Code generated. If any of the above fields is not valid, set as "ERROR, <field that failed>". E.g.: ERROR, FREQUENCY_DETAIL
}
我的流程如下:
- 从文件夹中读取 csv 文件
- 转换为 UserBean(使用 openCsv)
- 如果任何 bean 的状态包含“ERROR”,则写入名为“errorSummaryReportChannel”的单独通道。
此通道将用户 ID + 状态写入文件。
4.对于所有 bean(status = "SUCCESS" 或 status = "ERROR"),转换为 JSON 并记录输出。
我需要帮助的地方:
第 3 步
如果 userBean 的状态为“ERROR”,则写入“errorSummaryReportChannel”。 对于所有状态,继续正常流程。
我认为必须添加输出通道和丢弃通道,但找不到任何示例。
我的代码:
@Configuration
public class CreateUserConfiguration {
@Bean
public IntegrationFlow createUser() {
return IntegrationFlows.from(Files.inboundAdapter(new File(INPUT_DIR)))
.enrichHeaders(h -> h.header("errorChannel", "exceptionChannel", true))
.transform(csvToUserBeanTransformer, "convertCsvToUserBean")
.split(userBeanSplitter, "splitUserBeans")
.wireTap(flow -> flow.<PrimeAOBean>filter(primeAOBean -> primeAOBean.getStatus().equalsIgnoreCase("SUCCESS"), errorFlow -> errorFlow.discardChannel("errorSummaryReportGenerationChannel")))
.transform(userBeanToJSONTransformer, "convertUserBeanToJSON")
.handle(Files.outboundAdapter(new File(OUTPUT_SUCCESS_DIRECTORY)))
.get();
}
@Bean
public IntegrationFlow logErrorSummary() {
return IntegrationFlows.from("errorSummaryReportGenerationChannel")
.handle((p,h) -> {
return ((UserBean)(p)).getUserID() + "\t" + ((UserBean)(p)).getStatus();
})
.transform(Transformers.objectToString())
.handle(Files.outboundAdapter(new File(OUTPUT_FAILED_REPORT_FILE_NAME)))
.get();
}
@Bean
public IntegrationFlow logError() {
return IntegrationFlows.from("exceptionChannel")
.enrichHeaders(h -> h.headerExpression("errorFileName", "payload.failedMessage.headers.fileName"))
.transform(Transformers.toJson())
.handle(Files.outboundAdapter(new File(generateOutputDirectory(OUTPUT_FAILED_DIRECTORY))))
.get();
}
}
有人可以帮忙吗?
【问题讨论】:
-
@Artem Bilan,你能指导我吗?
标签: filter spring-integration channel