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