Spring Batch中的XML编组

我有一个JdbcCursorItemReader,它从数据库中读取并使用行映射器将结果集转换为对象 . 现在的要求是将对象编组为XML,然后必须将其放在消息队列中 .

三个问题:

1. Spring Batch中的编组器是作为ItemProcessor还是作为ItemWriter实现的?

2. 无需将XML写入文件,而只需将其作为字符串对象发送到消息中 . Spring Batch中最好的方法是什么?

3. 如果编组器和消息调度程序都应该作为单独的编写器实现,那么如何将它们链接起来呢?

任何示例代码或链接将非常感激 .

谢谢

回答(2)

2 years ago

我认为Spring Batch现在可以使用 ChannelItemWriter . 如果您从将XML剪辑写入Spring集成通道(可以由消息队列支持)的角度来处理此问题,则可以通过这种方式编写自定义 ItemWriter . 这将允许您以几种不同的方式接近项目转换(在 ItemProcessor 或通过Spring Integration中的变换器) . 如果你采用这种方法,我建议你将作者贡献给Spring Batch .

2 years ago

创建一个自定义编写器,将在通过ItemWriter写入数据时使用 .

示例代码HERE,根据您的要求进行了一些修改:

import java.io.StringWriter;
import java.io.Writer;

import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;

public class CustomXMLWriter extends org.springframework.batch.item.xml.StaxEventItemWriter<User> {

    private Writer myWriter;

    /**
     * Subclasses can override to customize the writer.
     */
    @Override
    protected XMLEventWriter createXmlEventWriter(XMLOutputFactory outputFactory, Writer writer)
            throws XMLStreamException {
        myWriter = new StringWriter();
        return outputFactory.createXMLEventWriter(myWriter);
    }

    @Override
    public void close() {
        String outputXML = myWriter.toString() + "</" + this.getRootTagName() + ">";
        System.out.println(outputXML);
        // code here to add the resultant XML string in message queue
        super.close();
    }

}

在此示例中,您必须提及输出资源,但生成的XML文件始终只包含根标记名称 .

XML:

<bean id="customXMLItemWriter" class="com.mkyong.CustomXMLWriter">
    <property name="resource" value="file:xml/outputs/users.xml" />
    <property name="marshaller" ref="userUnmarshaller" />
    <property name="rootTagName" value="users" />
</bean>