You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2015/03/21 12:35:13 UTC
[2/2] camel git commit: CAMEL-7474: Add option to mail consumer to
skip or handle if there is an error retrieving a mail from the mailbox. This
can avoid an endless problem if one mail is problematic.
CAMEL-7474: Add option to mail consumer to skip or handle if there is an error retrieving a mail from the mailbox. This can avoid an endless problem if one mail is problematic.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/99106e41
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/99106e41
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/99106e41
Branch: refs/heads/camel-2.15.x
Commit: 99106e411de7e7e94a905320846d663430482e92
Parents: adf655d
Author: Claus Ibsen <da...@apache.org>
Authored: Sat Mar 21 12:31:47 2015 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Sat Mar 21 12:37:06 2015 +0100
----------------------------------------------------------------------
.../camel/component/mail/MailConfiguration.java | 34 +++++++++++++-
.../camel/component/mail/MailConsumer.java | 47 ++++++++++++++++++--
.../camel/component/mail/MailEndpoint.java | 3 ++
3 files changed, 79 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/99106e41/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 526e32c..794ebf6 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
@@ -20,7 +20,6 @@ import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
-
import javax.mail.Message;
import javax.mail.Session;
import javax.net.ssl.SSLContext;
@@ -98,6 +97,10 @@ public class MailConfiguration implements Cloneable {
private boolean closeFolder = true;
@UriParam(defaultValue = "true") @Metadata(label = "consumer")
private boolean peek = true;
+ @UriParam @Metadata(label = "consumer")
+ private boolean skipFailedMessage;
+ @UriParam @Metadata(label = "consumer")
+ private boolean handleFailedMessage;
@UriParam
private SSLContextParameters sslContextParameters;
private ClassLoader applicationClassLoader;
@@ -633,4 +636,33 @@ public class MailConfiguration implements Cloneable {
public void setPeek(boolean peek) {
this.peek = peek;
}
+
+ public boolean isSkipFailedMessage() {
+ return skipFailedMessage;
+ }
+
+ /**
+ * If the mail consumer cannot retrieve a given mail message, then this option allows to skip
+ * the message and move on to retrieve the next mail message.
+ * <p/>
+ * The default behavior would be the consumer throws an exception and no mails from the batch would be able to be routed by Camel.
+ */
+ public void setSkipFailedMessage(boolean skipFailedMessage) {
+ this.skipFailedMessage = skipFailedMessage;
+ }
+
+ public boolean isHandleFailedMessage() {
+ return handleFailedMessage;
+ }
+
+ /**
+ * If the mail consumer cannot retrieve a given mail message, then this option allows to handle
+ * the caused exception by the consumer's error handler. By enable the bridge error handler on the consumer,
+ * then the Camel routing error handler can handle the exception instead.
+ * <p/>
+ * The default behavior would be the consumer throws an exception and no mails from the batch would be able to be routed by Camel.
+ */
+ public void setHandleFailedMessage(boolean handleFailedMessage) {
+ this.handleFailedMessage = handleFailedMessage;
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/99106e41/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 2015cca..7ba9397 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
@@ -16,8 +16,10 @@
*/
package org.apache.camel.component.mail;
+import java.util.ArrayList;
import java.util.Enumeration;
import java.util.LinkedList;
+import java.util.List;
import java.util.Queue;
import java.util.UUID;
import javax.mail.Flags;
@@ -54,6 +56,8 @@ public class MailConsumer extends ScheduledBatchPollingConsumer {
private final JavaMailSender sender;
private Folder folder;
private Store store;
+ private boolean skipFailedMessage;
+ private boolean handleFailedMessage;
/**
* Is true if server is an IMAP server and supports IMAP SORT extension.
@@ -251,11 +255,9 @@ public class MailConsumer extends ScheduledBatchPollingConsumer {
}
} else {
if (searchTerm != null) {
- // Only search
- messages = folder.search(searchTerm);
+ messages = folder.search(searchTerm, retrieveAllMessages());
} else {
- // No search
- messages = folder.getMessages();
+ messages = retrieveAllMessages();
}
// Now we can sort (emulate email sort but restrict sort terms)
if (sortTerm != null) {
@@ -265,6 +267,28 @@ public class MailConsumer extends ScheduledBatchPollingConsumer {
return messages;
}
+ private Message[] retrieveAllMessages() throws MessagingException {
+ int total = folder.getMessageCount();
+ List<Message> msgs = new ArrayList<Message>();
+
+ // Note that message * numbers start at 1, not 0
+ for (int i = 1; i <= total; i++) {
+ try {
+ Message msg = folder.getMessage(i);
+ msgs.add(msg);
+ } catch (MessagingException e) {
+ if (skipFailedMessage) {
+ LOG.debug("Skipping failed message at index " + i + " due " + e.getMessage(), e);
+ } else if (handleFailedMessage) {
+ handleException(e);
+ } else {
+ throw e;
+ }
+ }
+ }
+ return msgs.toArray(new Message[msgs.size()]);
+ }
+
/**
* @return Search term from endpoint (including "seen" check) or null if there is no search term
*/
@@ -508,4 +532,19 @@ public class MailConsumer extends ScheduledBatchPollingConsumer {
return (MailEndpoint) super.getEndpoint();
}
+ public boolean isSkipFailedMessage() {
+ return skipFailedMessage;
+ }
+
+ public void setSkipFailedMessage(boolean skipFailedMessage) {
+ this.skipFailedMessage = skipFailedMessage;
+ }
+
+ public boolean isHandleFailedMessage() {
+ return handleFailedMessage;
+ }
+
+ public void setHandleFailedMessage(boolean handleFailedMessage) {
+ this.handleFailedMessage = handleFailedMessage;
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/99106e41/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java
index a7a89cd..4f9e3be 100644
--- a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java
+++ b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailEndpoint.java
@@ -104,6 +104,9 @@ public class MailEndpoint extends ScheduledPollEndpoint {
public Consumer createConsumer(Processor processor, JavaMailSender sender) throws Exception {
MailConsumer answer = new MailConsumer(this, processor, sender);
+ answer.setHandleFailedMessage(configuration.isHandleFailedMessage());
+ answer.setSkipFailedMessage(configuration.isSkipFailedMessage());
+
// ScheduledPollConsumer default delay is 500 millis and that is too often for polling a mailbox,
// so we override with a new default value. End user can override this value by providing a consumer.delay parameter
answer.setDelay(MailConsumer.DEFAULT_CONSUMER_DELAY);