Spring batch Spring批处理中的XML编组

Spring batch Spring批处理中的XML编组,spring-batch,Spring Batch,我有一个JdbcCursorItemReader,它从数据库中读取数据,并使用行映射器将结果集转换为对象。现在的需求是将对象打包成XML,然后必须将XML放入消息队列中 三个问题: 1.Spring批处理中的封送处理程序应该实现为ItemProcessor还是ItemWriter 2.无需将XML写入文件,只需将其作为消息中的字符串对象发送即可。Spring Batch中最好的方法是什么 3.如果封送拆收器和消息分派器都应该作为单独的写入程序实现,那么如何将它们链接起来呢 任何示例代码或链接都将

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

三个问题:

1.Spring批处理中的封送处理程序应该实现为ItemProcessor还是ItemWriter

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

3.如果封送拆收器和消息分派器都应该作为单独的写入程序实现,那么如何将它们链接起来呢

任何示例代码或链接都将非常感谢


谢谢

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

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

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();
    }

}
导入java.io.StringWriter;
导入java.io.Writer;
导入javax.xml.stream.XMLEventWriter;
导入javax.xml.stream.XMLOutputFactory;
导入javax.xml.stream.XMLStreamException;
公共类CustomXMLWriter扩展org.springframework.batch.item.xml.StatxeventitemWriter{
私人作家;
/**
*子类可以重写以自定义编写器。
*/
@凌驾
受保护的XMLEventWriter createXmlEventWriter(XMLOutputFactory outputFactory,Writer-Writer)
抛出XMLStreamException{
myWriter=新的StringWriter();
返回outputFactory.createXMLEventWriter(myWriter);
}
@凌驾
公众假期结束(){
字符串outputXML=myWriter.toString()+“”;
System.out.println(outputXML);
//此处的代码用于在消息队列中添加生成的XML字符串
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>


我认为SpringBatch现在可以使用
ChannelItemWriter
。如果您从将XML片段写入Spring集成通道(然后可以由消息队列支持)的角度来处理这个问题,那么您可以这样编写定制的
ItemWriter
。这将允许您以两种不同的方式(在
ItemProcessor
中或在Spring集成中通过transformer)进行项转换。如果您采用这种方法,我建议您将作者重新贡献给Spring Batch。

谢谢。有一件事,看起来这段代码需要添加到close()方法中:myWriter.append(“”);否则,xml将不会用根标记关闭。请告诉我它是否按照你的要求工作。到目前为止看起来不错,谢谢。我将尝试将这个ItemWriter放在一个步骤中,然后进行第二个步骤,它将获取第一个步骤的输出。第二步将使用JMSItemWriter。谢谢,我已经更新了我的答案,最后也添加了根标记名。不明白你的意思。如何在Spring Batch中通过ItemProcessor完成XML封送?您必须实现一个定制的
ItemProcessor
,它接收您的项目并返回一个字符串,然后手动进行封送。Spring批处理中没有组件可以开箱即用。