Streaming mule esb中数据映射器中的流
我需要从一个大小为100MB-200MB的文件中获取数据(input.xml),并需要根据某种逻辑写入四个不同的文件 输入xml:Streaming mule esb中数据映射器中的流,streaming,mule,datamapper,Streaming,Mule,Datamapper,我需要从一个大小为100MB-200MB的文件中获取数据(input.xml),并需要根据某种逻辑写入四个不同的文件 输入xml: <?xml version="1.0"?> <Orders> <Order><OrderId>1</OrderId><Total>10</Total><Name>jon1</Name&
<?xml version="1.0"?>
<Orders>
<Order><OrderId>1</OrderId><Total>10</Total><Name>jon1</Name></Order>
<Order><OrderId>2</OrderId><Total>20</Total><Name>jon2</Name></Order>
<Order><OrderId>3</OrderId><Total>30</Total><Name>jon3</Name></Order>
<Order><OrderId>4</OrderId><Total>40</Total><Name>jon4</Name></Order>
<Orders>
110jon1
2202
330jon3
4404
逻辑是如果总数为1-10,则写入文件1;如果总数为11-20,则写入文件2
预期产出:
1 10 jon1-->写入文件1
2 20 jon2-->写入文件2
3 30 jon3-->写入文件3
4 40 jon4-->写入文件4
在这里,我已经在datamapper中启用了流,它正在配置中,但是我没有得到正确的输出。问题是我只把一些代码记录到一个文件中,在满足条件后应该进入该文件
但若我禁用datamapper中的流按钮,它就可以正常工作了。由于有大量的记录,我必须使用流媒体选项
是否有其他方法配置datamapper以启用流选项
请就此向我提出建议。谢谢。,如果不详细说明您正在做的工作,很难看到问题。 然而,我认为这可能会帮助你尝试另一种方法 数据映射器将把完整的XML文档加载到内存中,尽管您激活了流,但它必须这样做才能支持XPATH(它将完整的XML输入加载到DOM中)。 所以,如果您负担不起将200Mb文档加载到内存中,您需要尝试一种解决方法 我之前所做的是创建一个java组件,在stax解析器的帮助下将输入流转换为迭代器。通过一个非常简单的实现,您可以编写一个迭代器,该迭代器从流中提取来创建下一个元素(pojo、映射、字符串……)。在mule流中,在“java组件”之后,您应该能够使用“for each”和“choice”,并应用您的逻辑 您的数据的一个快速示例:
package tests;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class OrdersStreamIterator implements Iterator<Map<String,String>> {
final static Log LOGGER = LogFactory.getLog(OrdersStreamIterator.class);
final InputStream is;
final XMLStreamReader xmlReader;
boolean end = false;
HashMap<String,String> next;
public OrdersStreamIterator(InputStream is)
throws XMLStreamException, FactoryConfigurationError {
this.is = is;
xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(is);
}
protected HashMap<String,String> _next() throws XMLStreamException {
int event;
HashMap<String,String> order = null;
String orderChild = null;
String orderChildValue = null;
while (xmlReader.hasNext()) {
event = xmlReader.getEventType();
if (event == XMLStreamConstants.START_ELEMENT) {
if (order==null) {
if (checkOrder()) {
order = new HashMap<String,String>();
}
}
else {
orderChild = xmlReader.getLocalName();
}
}
else if (event == XMLStreamConstants.END_ELEMENT) {
if (checkOrders()) {
end = true;
return null;
}
else if (checkOrder()) {
xmlReader.next();
return order;
}
else if (order!=null) {
order.put(orderChild, orderChildValue);
orderChild = null;
orderChildValue = null;
}
}
else if (order!=null && orderChild!=null){
switch (event) {
case XMLStreamConstants.SPACE:
case XMLStreamConstants.CHARACTERS:
case XMLStreamConstants.CDATA:
int start = xmlReader.getTextStart();
int length = xmlReader.getTextLength();
if (orderChildValue==null) {
orderChildValue = new String(xmlReader.getTextCharacters(), start, length);
}
else {
orderChildValue += new String(xmlReader.getTextCharacters(), start, length);
}
break;
}
}
xmlReader.next();
}
end = true;
return null;
}
protected boolean checkOrder() {
return "Order".equals(xmlReader.getLocalName());
}
protected boolean checkOrders() {
return "Orders".equals(xmlReader.getLocalName());
}
@Override
public boolean hasNext() {
if (end) {
return false;
}
else if (next==null) {
try {
next = _next();
} catch (XMLStreamException e) {
LOGGER.error(e.getMessage(), e);
end = true;
}
return !end;
}
else {
return true;
}
}
@Override
public Map<String,String> next() {
if (hasNext()) {
final HashMap<String,String> n = next;
next = null;
return n;
}
else {
return null;
}
}
@Override
public void remove() {
throw new RuntimeException("ReadOnly!");
}
// Test
public static String dump(Map<String,String> o) {
String s = "{";
for (Entry<String,String> e : o.entrySet()) {
if (s.length()>1) {
s+=", ";
}
s+= "\"" + e.getKey() + "\" : \"" + e.getValue() + "\"";
}
return s + "}";
}
public static void main(String[] argv) throws XMLStreamException, FactoryConfigurationError {
final InputStream is = OrdersStreamIterator.class.getClassLoader().getResourceAsStream("orders.xml");
final OrdersStreamIterator i = new OrdersStreamIterator(is);
while (i.hasNext()) {
System.out.println(dump(i.next()));
}
}
}
包测试;
导入java.io.InputStream;
导入java.util.HashMap;
导入java.util.Iterator;
导入java.util.Map;
导入java.util.Map.Entry;
导入javax.xml.stream.FactoryConfigurationError;
导入javax.xml.stream.XMLInputFactory;
导入javax.xml.stream.XMLStreamConstants;
导入javax.xml.stream.XMLStreamException;
导入javax.xml.stream.XMLStreamReader;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
公共类OrdersStreamiter实现迭代器{
最终静态日志记录器=LogFactory.getLog(OrdersStreamIterator.class);
最终输入流为;
最终XMLStreamReader xmlReader;
布尔结束=假;
HashMap-next;
public OrdersStreamizer(InputStream为)
引发XMLStreamException,FactoryConfigurationError{
this.is=is;
xmlReader=XMLInputFactory.newInstance().createXMLStreamReader(is);
}
受保护的HashMap_next()抛出XMLStreamException{
int事件;
HashMap顺序=null;
字符串orderChild=null;
字符串orderChildValue=null;
while(xmlReader.hasNext()){
event=xmlReader.getEventType();
if(event==XMLStreamConstants.START_元素){
if(order==null){
if(checkOrder()){
order=新的HashMap();
}
}
否则{
orderChild=xmlReader.getLocalName();
}
}
else if(event==XMLStreamConstants.END_元素){
if(checkOrders()){
结束=真;
返回null;
}
else if(checkOrder()){
xmlReader.next();
退货单;
}
else if(订单!=null){
order.put(orderChild,orderChildValue);
orderChild=null;
orderChildValue=null;
}
}
else if(order!=null&&orderChild!=null){
开关(事件){
案例XMLStreamConstants.SPACE:
大小写XMLStreamConstants.CHARACTERS:
案例XMLStreamConstants.CDATA:
int start=xmlReader.getTextStart();
int length=xmlReader.getTextLength();
if(orderChildValue==null){
orderChildValue=新字符串(xmlReader.getTextCharacters(),开始,长度);
}
否则{
orderChildValue+=新字符串(xmlReader.getTextCharacters(),开始,长度);
}
打破
}
}
xmlReader.next();
}
结束=真;
返回null;
}
受保护的布尔检查顺序(){
返回“Order”.equals(xmlReader.getLocalName());
}
受保护的布尔检查顺序(){
返回“Orders.equals(xmlReader.getLocalName());
}
@凌驾
公共布尔hasNext(){
若(完){
返回false;
}
else if(next==null){
试一试{
下一步=_下一步();
}捕获(XMLStreamException e){
LOGGER.error(e.getMessage(),e);
结束=真;
}
返回!结束;
}
否则{
返回true;
}
}
@凌驾
公共地图下一页(){
if(hasNext()){
最终HashMap n=next;
next=null;
返回n;
}
否则{
返回null;
}
}
@凌驾
公共空间删除(){
抛出新的RuntimeException(“只读!”);
}
//试验
公共静态字符串转储(映射o){
字符串s=“{”;
对于(条目e:o.entrySet()){
如果(s.长度()>1){
s+=“,”;
<flow name="testsFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/>
<scripting:component doc:name="Groovy">
<scripting:script engine="Groovy"><![CDATA[return tests.OrdersStreamIterator.class.getClassLoader().getResourceAsStream("orders.xml");]]></scripting:script>
</scripting:component>
<set-payload value="#[new tests.OrdersStreamIterator(payload)]" doc:name="Iterator"/>
<foreach doc:name="For Each">
<logger message="#[tests.OrdersStreamIterator.dump(payload)]" level="INFO" doc:name="Logger"/>
</foreach>
</flow>