我已经创建了一个读取csv文件并将数据写入新csv文件中的方法,我想在集成流程中调用该方法,所以基本上我是从FTP服务器上将一个名为FEFOexportBEY的csv文件拉出.csv,我想从该csv生成一个新文件,并将其命名为finalBEY.csv,该自定义方法应该进行编写,但是我想在从FTP轮询csv之后在流中调用它。 下面是自定义方法和流集成的编码,我发现可以使用.handle进行此操作,但找不到正确的方法。在我的旧项目中,我可以通过在xml配置中执行此操作,方法是使用方法的类名创建一个bean,然后将该方法注入到路由中,现在我正在使用DSL,如果有人可以提供帮助,应该有一种可能的方法
处理方法
*** Settings ***
Test Setup Log this is ran for every case
*** Test Cases ***
Case 1
Do Something
Case 2
[Setup] Log Custom case setup
Do Something Else
Case 3
Do The Third Thing
}
入站集成流。
@Component
public class CSVToCSVNoQ {
public CSVToCSVNoQ() {
}
public void writeCSVfinal(String payload,@Header("new") String newCSV,@Header("old") String oldCsv) throws IOException {
CSVReader reader = null;
reader = new CSVReader(new FileReader(oldCsv));
FileWriter fileWriter = new FileWriter(newCSV);
//try (CSVWriter writer = new CSVWriter(new FileWriter(newCSV), ',', CSVWriter.NO_QUOTE_CHARACTER)) {
try(CSVWriter csvWriter = new CSVWriter(fileWriter,CSVWriter.DEFAULT_SEPARATOR,
CSVWriter.NO_QUOTE_CHARACTER)){
List<String[]> line;
reader.readNext();
reader.readNext();
SimpleDateFormat from = new SimpleDateFormat("yyyy-mm-dd");
SimpleDateFormat to = new SimpleDateFormat("ddMMMyyyy");
line = reader.readAll();
Iterator<String[]> itr = line.iterator();
while (itr.hasNext()){
String[] array = itr.next();
if(array[0].equals("DET")) {
// System.out.println("Change Format " + to.format(from.parse(array[5])));
array[5] = to.format(from.parse(array[5]));
}
}
while (itr.hasNext()){
String[] array = itr.next();
System.out.println("Line " + itr.next());
}
csvWriter.writeAll(line);
csvWriter.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
旧的XML配置
public IntegrationFlow fileInboundFlowFromFTPServer(Branch myBranch) throws IOException {
final FtpInboundChannelAdapterSpec sourceSpecFtp = Ftp.inboundAdapter(createNewFtpSessionFactory(myBranch))
.preserveTimestamp(true)
//.patternFilter("*.csv")
.maxFetchSize(MAX_MESSAGES_PER_POLL)
.remoteDirectory(myBranch.getFolderPath())
.regexFilter("FEFOexport"+myBranch.getBranchCode()+".csv")
.deleteRemoteFiles(true)
.localDirectory(new File(myBranch.getBranchCode()))
.temporaryFileSuffix(TEMPORARY_FILE_SUFFIX)
/*.localFilenameExpression(new FunctionExpression<String>(s -> {
final int fileTypeSepPos = s.lastIndexOf('.');
return DateTimeFormatter
.ofPattern(TIMESTAMP_FORMAT_OF_FILES)
.withZone(ZoneId.of(TIMEZONE_UTC))
.format(Instant.now())
+ "_"
+ s.substring(0,fileTypeSepPos)
+ s.substring(fileTypeSepPos);
}))*/;
// Poller definition
final Consumer<SourcePollingChannelAdapterSpec> stockInboundPoller = endpointConfigurer -> endpointConfigurer
.id("stockInboundPoller")
.autoStartup(true)
.poller(poller());
IntegrationFlow flow = IntegrationFlows
.from(sourceSpecFtp, stockInboundPoller)
.transform(File.class, p ->{
// log step
LOG1.info("flow=stockInboundFlowFromAFT, message=incoming file: " + p);
return p;
})
.channel(CHANNEL_INTERMEDIATE_STAGE)
.handle(m -> {
try {
this.csvToCSVNoQ.writeCSVfinal("test", myBranch.getBranchCode() + "/final" + myBranch.getBranchCode() + ".csv", myBranch.getBranchCode() + "/FEFOexport" + myBranch.getBranchCode() + ".csv");
LOG1.info("Writing final file .csv " + m);
} catch (IOException e) {
e.printStackTrace();
}
})
.get();
return flow;
}
答案 0 :(得分:0)
首先,您的方法引用定义在.handle()
中是完全错误的。
无论如何,让我们暂时忘记它!
另一方面,您的writeCSVfinal()
方法签名并不那么友好于消息传递。从调用者的角度来看,您有两个参数是相同的,并且由于框架无法从请求消息中确定哪个参数与payload
有关,因此您将产生歧义。
但是我们仍然可以使用您的方法和.handle()
这样实现目标:
.handle(m -> this.cSVToCSVNoQ.writeCSVfinal(m.getPayload(), m.getHeaders().get(...)))
或者其他一些逻辑来真正确定方法参数的值。
还请记住,您的方法返回void
,因此此类处理程序只能在流结束时使用。没有什么可以作为输出发送到链中的下一个通道。
完全不清楚您的骆驼代码的工作方式。