2

現在、camel Bindy を使用して POJO からフラット ファイルを生成できますが、完全なファイルにヘッダーとフッターを追加することはできません。

しかし、ファイルにヘッダー/フッターを追加しようとすると、単一のレコードに追加されますが、ファイル内の各レコードではなく、ファイル全体に単一のヘッダー/フッターを追加する必要があります。

以下はコード スニペットです。

from("jpa:com.PACKAGENAME.RebatePayout?consumer.namedQuery=REBATE_PAYOUT&consumer.delay=500000&consumeLockEntity=true&consumeDelete=false")
    .routeId("rebateroute")
    .process(new Processor() {
        RebateOutputgenerator rop = new RebateOutputgenerator();
                @Override
                public void process(Exchange exchange) throws Exception {
                    exchange.getIn().setBody(rop.processEntities((RebatePayout) exchange.getIn().getBody()));
                    log.info("the exchange value is ", exchange);                         
                }
        })
        .process(new FahHeaderAndFooterHelper())
        .log("Fixed length format marshal....")
        .marshal(fixedLegth)
        .log("Fixed length format data....${body}")
        .to("file://C:/Users/vvakalap/Desktop/example/New folder?fileExist=Append&fileName=output.txt")
        .log("Data Saved in file...");

プロセスクラスは

public class FahHeaderAndFooterHelper implements Processor{
    @Override
    public void process(Exchange exchange) throws Exception {
        Map<String, Object> headerObjMap = new HashMap<String,Object>();
        headerObjMap.put(FahRecordHeader.class.getName(), new FahRecordHeader());
        if(exchange.getOut().getBody() == "null")
            exchange.getOut().setHeader(CAMEL_BINDY_FIXED_LENGTH_HEADER, headerObjMap);
        Map<String, Object> footerObjMap = new HashMap<String,Object>();
        footerObjMap.put(FahRecordFooter.class.getName(), new FahRecordFooter());
        exchange.getOut().setHeader(CAMEL_BINDY_FIXED_LENGTH_FOOTER, footerObjMap);
        exchange.getOut().setBody(exchange.getIn().getBody());
    }

POJO クラス

@Data
@Section(number=2)
@FixedLengthRecord(header = FahRecordHeader.class, footer = FahRecordFooter.class)
public class RebateFinalRecord implements Serializable {

    private static final long serialVersionUID = 7375828620208233805L;

    @DataField(pos = 1, length = 3)
    private String transactionRecordIdentifier;

    @DataField(pos = 4, length = 10)
    private String transactionNumber;

    @DataField(pos = 14, length = 5)
    private String transactionLineNumber;

    @DataField(pos = 19, length = 20)
    private String transactionDistributionType;

    @DataField(pos = 39, length = 30)
    private String eventTypeName;

    @DataField(pos = 69, length = 8)
    private String transactionDate;

    @DataField(pos = 77, length = 8)
    private String transactionEffectiveDate;

    @DataField(pos = 85, length = 5)
    private String transactingEntityValue;

    @DataField(pos = 90, length = 1)
    private String reciprocationFlag;

}

ビンディクラス

@Data
public class FahRecordHeader {
    @DataField(pos = 1, length = 3)
    private String fileRecordIdentifier = "000";
    @DataField(pos = 4, length = 15)
    private String controlIdentifierOrSequenceNumber = "LSCD00000000006";
    @DataField(pos = 19, length = 20)
    private String source = "LSCD";
}

@Data
public class FahRecordFooter {

    @DataField(pos = 1, length = 70)
    private String footer = "footervalusforfahrecord for cashrebates";
    /*
     * @DataField(pos = 2, length = 9, align = "R", paddingChar = &#39;0&#39;)
     * private int numberOfRecordsInTheFile;
     */
}
4

3 に答える 3

0

これは久しぶりですが、まだ役立つかもしれません。

CAMEL_BINDY_FIXED_LENGTH_HEADER および CAMEL_BINDY_FIXED_LENGTH_FOOTER ヘッダーを追加するときに、FahHeaderAndFooterHelper 条件を追加できます。

たとえば、ヘッダーに対してファイルが存在しないか空である場合や、ファイルがフッターに対して完全であると見なされる場合などです。

于 2018-05-17T08:14:23.380 に答える
0

hasHeaderのとhasFooterの属性を に設定してみまし@FixedLengthRecordtrueか?

@FixedLengthRecord(header = FahRecordHeader.class, 
                   footer = FahRecordFooter.class, 
                   hasHeader = true, 
                   hasFooter = true)

https://camel.apache.org/bindy.html#Bindy-4.FixedLengthRecordを参照してください。

于 2016-02-03T19:35:33.087 に答える