我正在从另一个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();
}
}
答案 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}")