Mule 使用VM端点处理文件

Mule 使用VM端点处理文件,mule,Mule,我正试图将一个大文件分块读取,创建一个分块数据列表,并将其发送到VM进行进一步处理。例如,我在一个文件中有9封电子邮件,我想一次处理3封,然后将3封电子邮件的列表放在一个VM上(每封都作为一个消息负载): [email01@gmail.com, email02@gmail.com, email03@gmail.com] [email04@gmail.com, email05@gmail.com, email06@gmail.com] [email07@gmail.com, email08@gma

我正试图将一个大文件分块读取,创建一个分块数据列表,并将其发送到VM进行进一步处理。例如,我在一个文件中有9封电子邮件,我想一次处理3封,然后将3封电子邮件的列表放在一个VM上(每封都作为一个消息负载):

[email01@gmail.com, email02@gmail.com, email03@gmail.com]
[email04@gmail.com, email05@gmail.com, email06@gmail.com]
[email07@gmail.com, email08@gmail.com, email09@gmail.com]


My EmailAddressFileReader.java组件:
公共类EmailAddressFileReader实现可调用{
私有静态最终记录器Logger=LoggerFactory.getLogger(EmailAddressFileReader.class);
@凌驾
公共对象onCall(MuleEventContext eventContext)引发异常{
InputStream文件流=(InputStream)eventContext.getMessage().getPayload();
DataInputStream ds=新的DataInputStream(fileStream);
BufferedReader br=新的BufferedReader(新的InputStreamReader(ds));
MuleClient MuleClient=eventContext.getMuleContext().getClient();
字符串电子邮件地址;
List emailAddressList=新建ArrayList();
而((emailAddress=br.readLine())!=null){
emailAddressList.add(emailAddress);
如果(emailAddressList.size()>2){
muleClient.dispatch(“vm://in”,emailAddressList,null);
logger.info(“发送到vm后:+emailAddressList”);
emailAddressList.clear();/???
}           
}
fileStream.close();
logger.info(“chuncked电子邮件地址文件”);
返回null;
}
}
我不知道如何处理和发送到VM只有3个(在本例中)。如果我删除list.clear()我会得到列表中的所有电子邮件[email01、email02…mail09],当我得到clear()时,我会得到一个空列表作为我的有效负载。

list-emailAddressList=new-ArrayList();
List<String> emailAddressList = new ArrayList<String>();

        while ((emailAddress = br.readLine()) != null) {
            emailAddressList.add(emailAddress);
            if(emailAddressList.size() > 2) {
                muleClient.dispatch("vm://in", emailAddressList, null);
                logger.info("after dispatch to vm: " + emailAddressList);
                emailAddressList = new ArrayList<String>();
            }           
        }
而((emailAddress=br.readLine())!=null){ emailAddressList.add(emailAddress); 如果(emailAddressList.size()>2){ muleClient.dispatch(“vm://in”,emailAddressList,null); logger.info(“发送到vm后:+emailAddressList”); emailAddressList=新的ArrayList(); } }
我个人认为从组件发送消息不是一个好主意。它使流的可读性降低,因为它会为外部读取器做一些意想不到的事情

如果你真的想这么做,那就用一个

不过,我建议:

  • 如果您有EE许可证,请使用它
  • 创建一个转换器,将输入流转换为列表的迭代器,然后连接foreach
  • 创建一个自定义拆分器,用于将InputStream拆分为多个列表

谢谢,这很有效。但是,我仍然不明白为什么清除列表并将其与不同的项目一起发送与创建新列表相比有效。感谢Victor的输入,我已将流更改为使用foreach:“”
public class EmailAddressFileReader implements Callable{

    private static final Logger logger = LoggerFactory.getLogger(EmailAddressFileReader.class);

    @Override
    public Object onCall(MuleEventContext eventContext) throws Exception {

        InputStream fileStream = (InputStream) eventContext.getMessage().getPayload();
        DataInputStream ds = new DataInputStream(fileStream);
        BufferedReader br = new BufferedReader(new InputStreamReader(ds));

        MuleClient muleClient = eventContext.getMuleContext().getClient();

        String emailAddress;
        List<String> emailAddressList = new ArrayList<String>();

        while ((emailAddress = br.readLine()) != null) {
            emailAddressList.add(emailAddress);
            if(emailAddressList.size() > 2) {
                muleClient.dispatch("vm://in", emailAddressList, null);
                logger.info("after dispatch to vm: " + emailAddressList);
                emailAddressList.clear();//???
            }           
        }
        fileStream.close();
        logger.info("chuncked email address file");
        return null;
    }
}
List<String> emailAddressList = new ArrayList<String>();

        while ((emailAddress = br.readLine()) != null) {
            emailAddressList.add(emailAddress);
            if(emailAddressList.size() > 2) {
                muleClient.dispatch("vm://in", emailAddressList, null);
                logger.info("after dispatch to vm: " + emailAddressList);
                emailAddressList = new ArrayList<String>();
            }           
        }