当前位置: 首页 > 知识库问答 >
问题:

如何封送多个BindyFixedLengthDataFormat模型(CAMEL-Bindy-2.16)

艾照
2023-03-14

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

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

<bean id="bindyFixedLengthDataformat"  class="org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat">
    <constructor-arg value="com.sample.package" />
</bean>
<marshal ref="bindyFixedLengthDataformat" />

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

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

我一直找不到任何例子,可以实现相同的功能与删除的构造函数。

谢谢。

共有1个答案

鲁靖
2023-03-14

这是一个老帖子,但我确实想出了解决办法。这个想法是,您必须为每个类创建一个单独的bindy格式化程序...然后将每个格式化程序应用到camel消息的正文:

/* 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) */
 类似资料:
  • 问题内容: 我试图编组多个对象,例如添加到via中。我开始使用此设置: 和 但是,我得到了以下运行时例外: javax.xml.bind.JAXBException:com.jaxb.example.marshall.Book或其任何超类对此上下文都是未知的] 我的类型定义如下。 书:- 图书清单:- 马歇尔代码:- 我正在尝试放置注释(参考:-JAXB异常:该上下文未知的类)。该注释在我的版本中

  • 我有一个带有绑定的REST-dsl骆驼路由:json_xml with.type()和outType()。当没有异常发生时,它工作得很好。也就是说,json输入给出了json输出。Xml输入给出Xml输出。

  • 我是Apache Camel和Java DSL的新手。我想通过使用图像处理工具将一个图像文件分割到不同的endpoint。什么是所有的组件我需要使用来实现这一点,我还需要发送分割图像到一个更多的endpoint。

  • 我有一个遗留web服务项目,它接收两个不同的XML模式,但属性名称相同(包括根元素)。我正在使用Spring、OXM和JAXB2进行编组/解组。 我已经用另一个问题解决了前面的一个问题,所以我使用SAX解析器来确定使用哪一个解组器。解析XML时,我检查一个值,然后就可以使用反编组器或其他反编组器。 我如何将其转换为更Spring(OXM)的方法呢?

  • 问题内容: 我想向不同的收件人发送数千封不同的电子邮件,并想打开与我的SMTP的连接并保留它。我希望这样可以更快,然后重新打开错误邮件的连接。我想为此使用Apache Commons Email,但如有必要,可以使用Java Mail API。 现在,我正在执行此操作,每次打开一个都会关闭连接: 问题答案: 这是我的性能测试课程。使用一个连接发送邮件的速度快4倍,然后每次都重新打开连接(使用普通邮

  • 我尝试使用Apache Camel(版本2.25.3)反应流和Spring Boot来读取一个大型csv文件,并使用Bindy解封这些行。这是“工作”,因为应用程序运行并检测文件,但我只看到流中文件的第一行。它似乎与Bindy相关,因为如果我从等式中去掉解组,我就可以在流中返回csv文件的所有行。我已经简化了这个问题,在这里演示了SO。我正在使用Spring Webflux来公开结果发布者。 所以