Updated Branches: refs/heads/camel-2.11.x f2e85bb7d -> a01324c74 refs/heads/camel-2.12.x 21b8aae58 -> d12cba339 refs/heads/master 9e0f1acf5 -> 090f7dbba
CAMEL-6905: Added peek option to camel-mail. To mark mail as peek for IMAP messages to avoid mail server eager mark the mail as SEEN in case we rollback. Thanks to Dan Ambrose for reporting. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/090f7dbb Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/090f7dbb Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/090f7dbb Branch: refs/heads/master Commit: 090f7dbba42e217af2b660c17bd8de3bd47d3e71 Parents: 9e0f1ac Author: Claus Ibsen <davscl...@apache.org> Authored: Sat Oct 26 16:05:18 2013 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sat Oct 26 16:06:12 2013 +0200 ---------------------------------------------------------------------- .../camel/component/mail/MailConfiguration.java | 9 +++++++ .../camel/component/mail/MailConsumer.java | 26 +++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/090f7dbb/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java ---------------------------------------------------------------------- diff --git a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java index bb0d70e..29c5cca 100644 --- a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java +++ b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java @@ -63,6 +63,7 @@ public class MailConfiguration implements Cloneable { private boolean ignoreUnsupportedCharset; private boolean disconnect; private boolean closeFolder = true; + private boolean peek = true; private SSLContextParameters sslContextParameters; public MailConfiguration() { @@ -493,4 +494,12 @@ public class MailConfiguration implements Cloneable { public void setCopyTo(String copyTo) { this.copyTo = copyTo; } + + public boolean isPeek() { + return peek; + } + + public void setPeek(boolean peek) { + this.peek = peek; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/090f7dbb/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java ---------------------------------------------------------------------- diff --git a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java index dfcec4c..99a206d 100644 --- a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java +++ b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java @@ -31,9 +31,9 @@ import javax.mail.Store; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.impl.ScheduledBatchPollingConsumer; -import org.apache.camel.spi.Synchronization; import org.apache.camel.support.SynchronizationAdapter; import org.apache.camel.util.CastUtils; +import org.apache.camel.util.IntrospectionSupport; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -180,6 +180,12 @@ public class MailConsumer extends ScheduledBatchPollingConsumer { // must use the original message in case we need to workaround a charset issue when extracting mail content final Message mail = exchange.getIn(MailMessage.class).getOriginalMessage(); + // need to call setPeek on java-mail to avoid the message being flagged eagerly as SEEN on the server in case + // we process the message and rollback due an exception + if (getEndpoint().getConfiguration().isPeek()) { + peekMessage(mail); + } + // add on completion to handle after work when the exchange is done exchange.addOnCompletion(new SynchronizationAdapter() { public void onComplete(Exchange exchange) { @@ -210,6 +216,19 @@ public class MailConsumer extends ScheduledBatchPollingConsumer { return total; } + private void peekMessage(Message mail) { + // this only applies to IMAP messages which has a setPeek method + if (mail.getClass().getName().startsWith("IMAP")) { + try { + LOG.trace("Calling setPeek(true) on mail message {}", mail); + IntrospectionSupport.setProperty(mail, "peek", true); + } catch (Throwable e) { + // ignore + LOG.trace("Error setting peak property to true on: " + mail + ". This exception is ignored.", e); + } + } + } + protected Queue<Exchange> createExchanges(Message[] messages) throws MessagingException { Queue<Exchange> answer = new LinkedList<Exchange>(); @@ -222,6 +241,11 @@ public class MailConsumer extends ScheduledBatchPollingConsumer { for (int i = 0; i < count; i++) { Message message = messages[i]; + + if (LOG.isTraceEnabled()) { + LOG.trace("Mail #{} is of type: {} - {}", new Object[]{i, ObjectHelper.classCanonicalName(message), message}); + } + if (!message.getFlags().contains(Flags.Flag.DELETED)) { Exchange exchange = getEndpoint().createExchange(message); if (getEndpoint().getConfiguration().isMapMailMessage()) {