无法覆盖Apache骆驼中的处理器之间的bean属性

时间:2020-09-23 18:19:58

标签: java apache-camel spring-camel

我正在从另一个API接收json负载,对其进行处理并将其写入文件中。 我还需要将页眉和页脚记录以及json有效内容写为主体。 文件名必须是一些静态文本和一些来自json有效负载的值。(例如:A_20171113170000_seq_no_XXX_T_no_of_records.SAP) 标头具有一些静态值,并且需要根据json有效负载动态设置一些属性(序列号,时间戳和记录数)。 我必须从另外2个端点再创建2个文件。这些文件的页眉和页脚值也将是动态的。 如何在处理器外部传递文件名,以便可以动态写入文件?

@Autowired
private Header header;

private Trailer footer;

private String file_name;

@SuppressWarnings("deprecation")
@Override
public final void configure() {
    
    LocalDateTime myDateObj = LocalDateTime.now();
    logger.info("Before formatting: " + myDateObj);
    DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    String formattedDate = myDateObj.format(myFormatObj);
    
    String year = formattedDate.substring(0, 4);
    String month = formattedDate.substring(5, 7);
    String day = formattedDate.substring(8, 10);
    String hour = formattedDate.substring(11, 13);
    String minute = formattedDate.substring(14, 16);
    String second = formattedDate.substring(17);
    
    String dateString = year+month+day;
    String timeString = hour+minute+second;
    try {
        restConfiguration().component("jetty").port(httpPort).bindingMode(RestBindingMode.json);
        rest("/api/bcr/getResponseFromMax")
        .get().consumes(MediaType.APPLICATION_JSON_VALUE)
        .route()
        .log("return response from max")
        .setBody()
        .constant("return response from max");
        
        final DataFormat basicPayBindy = new BindyFixedLengthDataFormat(BasicPay.class);
        

        rest("/api/bcr/basicpay")
        .post().consumes(MediaType.APPLICATION_JSON_VALUE).type(BasicPayResults.class).outType(ResponseEntity.class).route()
        .process(
                ex -> {
                    BasicPayResults result = ex.getIn().getBody(BasicPayResults.class);
                    List<BasicPay> employee = result.getResults();
                    file_name = Constants.FILE_NO+"_"+dateString+timeString+"_"+Constants.EMP+result.getSequenceNumber()+"_"+Constants.G2I+".SAP";
                    header.setHeader7(Constants.FILE_NO+"_"+dateString+timeString+"_"+Constants.EMP+result.getSequenceNumber()+"_"+Constants.G2I+".SAP");
                    logger.info("getSequenceNumber - "+result.getSequenceNumber()+" | file_name - "+file_name);
                    header.setHeader8(dateString);
                    header.setHeader9(timeString);
                    header.setHeader10(Constants.ENVIRONMENT);
                    
                    footer = new Trailer("TRAILER",(employee.size()+2));
                    ex.getOut().setBody(employee);
                    
                })
        .log("add trailer to the file")
        .process(
                ex -> {
                    logger.info(header.getHeader1()+" | "+header.getHeader2()+" | "+header.getHeader3()+" | "+header.getHeader4()+" | "+header.getHeader5()
                    +" | "+header.getHeader6()+" | "+header.getHeader7()+" | "+header.getHeader8()+" | "+header.getHeader9()+" | "+header.getHeader10()+" | "+header.getHeader11());
                    Map<String, Object> headerObjMap = new HashMap<String,Object>();
                    headerObjMap.put(Header.class.getName(), header);
                    logger.info(" *** file_name 1 - "+file_name);
                    Map<String, Object> footerObjMap = new HashMap<String,Object>();
                    footerObjMap.put(Trailer.class.getName(), footer);
                    
                    ex.getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_HEADER, headerObjMap);
                    ex.getOut().setBody(ex.getIn().getBody());
                    ex.getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_FOOTER, footerObjMap);
                    
                })
        .marshal(basicPayBindy)
        .convertBodyTo(byte[].class, "iso-8859-1")
        .setBody(body().regexReplaceAll("\\|", "\\|\""))
        .to("file:app/bcr-files?fileName="+header.getHeader7())
        .end();
        
    }
}

1 个答案:

答案 0 :(得分:0)

我找到了问题的答案。

我们可以将值通过标头传递,并在过程外访问它们。 确保使用与其他值相同的方法进行设置。 例如,在下面的代码中,我在ex.getOut()中设置了正文,页眉和页脚值。 最初,我在ex.getIn()中尝试了此方法,但没有成功。因此,为了传递文件名,我们需要在ex.getOut()而不是ex.getIn()中进行设置。

ex.getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_HEADER, headerObjMap);
ex.getOut().setBody(employee);
ex.getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_FOOTER, footerObjMap);
ex.getOut().setHeader("file_name1", file_name1);

按如下所示在进程外访问文件名

.to("file:app/bcr-files?fileName=${header.file_name1}")