首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理多个BindyFixedLengthDataFormat模型(camel-bindy-2.16)

如何处理多个BindyFixedLengthDataFormat模型(camel-bindy-2.16)
EN

Stack Overflow用户
提问于 2016-03-02 20:13:38
回答 1查看 1.4K关注 0票数 2

我目前正试图从camel-bindy-2.12.1升级到camel-bindy-2.16.2,并且在试图将由多个类组成的模型应用于一个数据集时遇到了一个问题,导致了一个单一文本文件。

包(com.sample.package)中有许多类,可以使用以下代码(Camel Spring )进行封送处理:

代码语言:javascript
复制
<bean id="bindyFixedLengthDataformat"  class="org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat">
    <constructor-arg value="com.sample.package" />
</bean>

然后在封送时引用bean:

代码语言:javascript
复制
<marshal ref="bindyFixedLengthDataformat" />

此bean调用将将包中的所有类应用于正在封送的数据,从而生成一个文件。

它在camel-bindy-2.12.1中运行得很好,但是上面的构造函数在camel-bindy-2.16.2.中不再可用。

我一直无法找到任何可以实现与已删除构造函数相同功能的示例。

有人遇到过这种情况吗?如果是的话,任何建议/例子都将不胜感激。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-01-02 18:45:35

这是个老职位,但我想出了一个解决办法。这样做的想法是,您必须为每个class...then创建一个单独的bindy格式化程序,将每个格式化程序应用于骆驼消息的主体:

代码语言:javascript
复制
/* BEGIN Spring Boot Bean Config */

import org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat;

@Autowired
CamelContext camelContext;

@Bean (name="bindyFixedLengthDataformat_Part1")
public BindyFixedLengthDataFormat bindyFixedLengthDataformat_Part1 () {

    BindyFixedLengthDataFormat bindy = new BindyFixedLengthDataFormat (com.xyz.Part1.class);

    bindy.setCamelContext(camelContext);

    return bindy;
}

@Bean (name="bindyFixedLengthDataformat_Part2")
public BindyFixedLengthDataFormat bindyFixedLengthDataformat_Part2 () {

    BindyFixedLengthDataFormat bindy = new BindyFixedLengthDataFormat (com.xyz.Part2.class);

    bindy.setCamelContext(camelContext);

    return bindy;
}
...
@Bean (name="bindyFixedLengthDataformat_PartN")
public BindyFixedLengthDataFormat bindyFixedLengthDataformat_PartN () {

    BindyFixedLengthDataFormat bindy = new BindyFixedLengthDataFormat (com.xyz.PartN.class);

    bindy.setCamelContext(camelContext);

    return bindy;
}

@Bean (name="bindyConverter")
BindyConverterUtil bindyConverter () {

    BindyConverterUtil bindyConverter = new BindyConverterUtil () ;             //This is a custom bean containing all the converters you need. Implements method process (Exchange)

    bindyConverter.setBindyFixedLengthDataformat_Part1(bindyFixedLengthDataformat_Part1());
    bindyConverter.setBindyFixedLengthDataformat_Part2(bindyFixedLengthDataformat_Part2());

...

bindyConverter.setBindyFixedLengthDataformat_Part5(bindyFixedLengthDataformat_PartN());

    return bindyConverter;
}

@Bean (name="createObjectArrayListWithDataClasses")
public ListWithDifferentDataClasses createObjectArrayListWithDataClasses () {

    ListWithDifferentDataClasses lineValues = new ListWithDifferentDataClasses();           // This is a custom bean that basically creates an array list of classes containing the data you want to marshal 
                                                                                                // Implements method process(Exchange). 
                                                                                                // Adds classes using: exchange.getIn().setBody(<ArrayList of classes>);

    return lineValues;
}

/* END Spring Boot Bean Config */ 

/* Bindy Converter Util */

package com.xyz;

import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat;


public class BindyConverterUtil implements Processor {

    /* (non-Javadoc)
     * @see org.apache.camel.Processor#process(org.apache.camel.Exchange)
     */
    private BindyFixedLengthDataFormat bindyFixedLengthDataformat_Part1;
    private BindyFixedLengthDataFormat bindyFixedLengthDataformat_Part2;

    private BindyFixedLengthDataFormat bindyFixedLengthDataformat_PartN;

    public void setBindyFixedLengthDataformat_Part1 (BindyFixedLengthDataFormat bindyFormatter) {

        this.bindyFixedLengthDataformat_Part1 = bindyFormatter;
    }

    public void setBindyFixedLengthDataformat_Part2 (BindyFixedLengthDataFormat bindyFormatter) {

        this.bindyFixedLengthDataformat_Part2 = bindyFormatter;
    }

    public void setBindyFixedLengthDataformat_PartN (BindyFixedLengthDataFormat bindyFormatter) {

        this.bindyFixedLengthDataformat_PartN = bindyFormatter;
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    @Override
    public void process(Exchange exchange) throws Exception {
        // TODO Auto-generated method stub

        ArrayList <HashMap> contents = (ArrayList <HashMap>) exchange.getIn().getBody();        //From the createObjectArrayListWithDataClasses bean.

        OutputStream outputStream = new ByteArrayOutputStream();

        for (HashMap item: contents) {

            if ( null != item.get(Part1.class.getName()) ) {

                bindyFixedLengthDataformat_Part1.marshal(exchange, item.get(Part1.class.getName()), outputStream);
            }
            else if ( null != item.get(Part2.class.getName()) ) {

                bindyFixedLengthDataformat_Part2.marshal(exchange, item.get(Part2.class.getName()), outputStream);
            }
...
            else if ( null != item.get(PartN.class.getName()) ) {

                bindyFixedLengthDataformat_PartN.marshal(exchange, item.get(PartN.class.getName()), outputStream);
            }
            else {
                throw new Exception ("Bindy Converter - Cannot marshal record. Format is not recognized. ");
            }
        }

        exchange.getIn().setBody(outputStream);
    }
}

/* End Bindy Converter Util */


/* Camel Route (XML) */

<route id="xyxz" >
    <from uri="timer...or whatever" />

    <to uri="createObjectArrayListWithDataClasses" />

    <to uri="bindyConverter" />

    <to uri="file://somepath/?fileName=outputfileName_${date:now:yyyyMMddhhmmss}.txt" />
</route>

/* End Camel Route (XML) */
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35757186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档