Java 轮询后将邮件标记为未读-Apache Camel

Java 轮询后将邮件标记为未读-Apache Camel,java,email,apache-camel,pooling,Java,Email,Apache Camel,Pooling,当轮询我的邮件被标记为已读时,我使用ApacheCamel和轮询消费者 options : delete=false&peek=false&unseen=true 在轮询之后,当我处理附件时,如果出现任何错误,我希望将邮件设置为“未读”。好让我以后再去游泳 public void process(Exchange exchange) throws Exception { Map<String, DataHandler> attachments = excha

当轮询我的邮件被标记为已读时,我使用ApacheCamel和轮询消费者

options : delete=false&peek=false&unseen=true
在轮询之后,当我处理附件时,如果出现任何错误,我希望将邮件设置为“未读”。好让我以后再去游泳

public void process(Exchange exchange) throws Exception {
    Map<String, DataHandler> attachments = exchange.getIn().getAttachments();

    Message messageCopy = exchange.getIn().copy();

    if (messageCopy.getAttachments().size() > 0) {
        for (Map.Entry<String, DataHandler> entry : messageCopy.getAttachments().entrySet()) {

            DataHandler dHandler = entry.getValue();

            // get the file name
            String filename = dHandler.getName();

            // get the content and convert it to byte[]
            byte[] data =
                    exchange.getContext().getTypeConverter().convertTo(byte[].class, dHandler.getInputStream());

            log.info("Downloading attachment, file name : " + filename);
            InputStream fileInputStream = new ByteArrayInputStream(data);
            try {
                // Processing attachments
                // if any error occurs here, i want to make the mail mark as unread
            } catch (Exception e) {
                log.info(e.getMessage());
            }
        }
    }
}
公共作废进程(Exchange)引发异常{
映射附件=exchange.getIn().getAttachments();
messageCopy=exchange.getIn().copy();
如果(messageCopy.getAttachments().size()>0){
对于(Map.Entry:messageCopy.getAttachments().entrySet()){
DataHandler dHandler=entry.getValue();
//获取文件名
字符串文件名=dHandler.getName();
//获取内容并将其转换为字节[]
字节[]数据=
exchange.getContext().getTypeConverter().convertTo(字节[].class,dHandler.getInputStream());
log.info(“下载附件,文件名:”+文件名);
InputStream文件InputStream=新的ByteArrayInputStream(数据);
试一试{
//处理附件
//如果此处出现任何错误,我希望将邮件标记为未读
}捕获(例外e){
log.info(如getMessage());
}
}
}
}

我注意到peek选项,通过将其设置为true,它不会在轮询期间将邮件标记为read,在这种情况下,是否有任何选项在处理后将邮件标记为read。

要获得您想要的结果,您应该有选项

peek=true&unseen=true
peek=true选项旨在确保邮件服务器上的邮件保持其轮询前的准确状态,即使出现异常。然而,目前它不起作用。这实际上是骆驼邮件组件中的一个错误。我已经向提交了一个补丁,这可能会在将来的版本中得到修复


作为一种解决方法,您可以设置mapMailMessages=false,但是您必须自己处理电子邮件内容。在Camel 2.15以后的版本中,您还有postProcessAction选项,使用该选项,您可能会从有处理错误的消息中删除SEEN标志。不过,我还是建议您等待修复。

您解决了吗?我现在也有类似的问题