如何在集成流程中调用方法

时间:2018-12-11 10:09:37

标签: spring spring-integration

我已经创建了一个读取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;
}

1 个答案:

答案 0 :(得分:0)

首先,您的方法引用定义在.handle()中是完全错误的。

无论如何,让我们暂时忘记它!

另一方面,您的writeCSVfinal()方法签名并不那么友好于消息传递。从调用者的角度来看,您有两个参数是相同的,并且由于框架无法从请求消息中确定哪个参数与payload有关,因此您将产生歧义。

但是我们仍然可以使用您的方法和.handle()这样实现目标:

.handle(m -> this.cSVToCSVNoQ.writeCSVfinal(m.getPayload(), m.getHeaders().get(...)))

或者其他一些逻辑来真正确定方法参数的值。

还请记住,您的方法返回void,因此此类处理程序只能在流结束时使用。没有什么可以作为输出发送到链中的下一个通道。

完全不清楚您的骆驼代码的工作方式。