Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在apache camel中的处理器之间重写bean属性_Java_Apache Camel_Spring Camel - Fatal编程技术网

Java 无法在apache camel中的处理器之间重写bean属性

Java 无法在apache camel中的处理器之间重写bean属性,java,apache-camel,spring-camel,Java,Apache Camel,Spring Camel,我从另一个api接收json负载,处理它并将其写入文件。 我还需要将页眉和页脚记录与json有效负载一起写入正文。 文件名必须是一些静态文本和一些来自json负载的值。(例如:A_20171113170000_seq_no_XXX_T_no_of_records.SAP) 标头有一些静态值,一些属性(序列号、时间戳和记录数)需要根据json负载动态设置。 我必须从另外两个端点再创建两个文件。这些文件的页眉和页脚值也是动态的。 如何将文件名传递到处理器外部,以便动态写入文件 @Autowired

我从另一个api接收json负载,处理它并将其写入文件。 我还需要将页眉和页脚记录与json有效负载一起写入正文。 文件名必须是一些静态文本和一些来自json负载的值。(例如:A_20171113170000_seq_no_XXX_T_no_of_records.SAP) 标头有一些静态值,一些属性(序列号、时间戳和记录数)需要根据json负载动态设置。 我必须从另外两个端点再创建两个文件。这些文件的页眉和页脚值也是动态的。 如何将文件名传递到处理器外部,以便动态写入文件

@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();
        
    }
}
@Autowired
私有报头;
私人拖车尾;
私有字符串文件名;
@抑制警告(“弃用”)
@凌驾
公共最终无效配置(){
LocalDateTime myDateObj=LocalDateTime.now();
logger.info(“格式化前:+myDateObj”);
DateTimeFormatter myFormatObj=模式的DateTimeFormatter.(“yyyy-MM-dd HH:MM:ss”);
字符串formattedDate=myDateObj.format(myFormatObj);
字符串year=formattedDate.substring(0,4);
String month=formattedDate.substring(5,7);
String day=formattedDate.substring(8,10);
字符串hour=formattedDate.substring(11,13);
字符串minute=formattedDate.substring(14,16);
String second=formattedDate.substring(17);
字符串dateString=年+月+日;
字符串时间字符串=小时+分钟+秒;
试一试{
restConfiguration().component(“jetty”).port(httpPort).bindingMode(RestBindingMode.json);
rest(“/api/bcr/getResponseFromMax”)
.get().consumes(MediaType.APPLICATION\u JSON\u值)
.路线(
.log(“从max返回响应”)

.常数(“来自最大值的返回响应”);
final DataFormat basicPayBindy=新的BindyFixedLengthDataFormat(BasicPay.class);
其余(“/api/bcr/basicpay”)
.post().consumes(MediaType.APPLICATION_JSON_VALUE).type(BasicPayResults.class).outType(ResponseEntity.class).route()
.过程(
ex->{
BasicPayResults result=ex.getIn().getBody(BasicPayResults.class);
List 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-”+结果.getSequenceNumber()+“|文件名-”+文件名);
header.setHeader8(日期字符串);
header.setHeader9(timeString);
header.setHeader10(Constants.ENVIRONMENT);
页脚=新的拖车(“拖车”(employee.size()+2));
例如getOut().setBody(员工);
})
.log(“将拖车添加到文件”)
.过程(
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 headerObjMap=新建HashMap();
headerObjMap.put(Header.class.getName(),Header);
logger.info(“***文件名1-”+文件名);
Map footerObjMap=新HashMap();
footerObjMap.put(traile.class.getName(),footer);
例如,getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_HEADER,headerObjMap);
例如getOut().setBody(例如getIn().getBody());
例如,getOut().setHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_FOOTER,footerObjMap);
})
元帅先生(basicPayBindy)
.convertBodyTo(字节[]。类别,“iso-8859-1”)
.setBody(body().regexReplaceAll(“\\\\\”,“\\\\\\\”)
.to(“文件:app/bcr文件?文件名=“+header.getHeader7())
.end();
}
}

我找到了这个问题的答案

我们可以通过标头传递值,并在进程外部访问它们。 确保将其设置为与其他值相同的方法。 例如,在下面的代码中,我在ex.getOut()中设置了body、header和footer值。 最初,我在ex.getIn()中尝试了它,但它不起作用。因此,为了传递文件名,我们需要在ex.getOut()而不是ex.getIn()中设置它

访问进程外部的文件名,如下所示

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

你知道,你正在修改
Header
的单例实例,因此你的应用程序无法在两个并行请求下正常工作,对吗?只需将请求范围内的所有内容存储在Exchange属性或Header中,不要像现在这样乱用类变量(Header、footer、file\u name)。然后,您可以在producer endpoint中将其与
toD
一起使用。嗨,Bedla,是的,我知道我无法覆盖header,因为它在自动连接时是一个单例对象。我尝试了使用静态值和动态设置值自动填充header中的各种方法。我正确地指出,我实例化了一个新的header对象(动态更改属性时,如果是静态的,则使用autowire)就像我在进程内实例化页脚并将其添加到exchange对象中一样。无论如何,我找到了答案。例如,getOut().setHeader()将完成此任务。
.to("file:app/bcr-files?fileName=${header.file_name1}")