@@ -341,66 +341,77 @@ private Folder obtainFolderInstance() throws MessagingException {
341341 @ Override
342342 public Object [] receive () throws javax .mail .MessagingException {
343343 this .folderReadLock .lock ();
344+ try {
345+ try {
346+ obtainFolder ();
347+ MimeMessage [] filteredMessages = searchAndFilterMessages ();
348+ if (this .headerMapper != null ) {
349+ org .springframework .messaging .Message <?>[] converted =
350+ new org .springframework .messaging .Message <?>[filteredMessages .length ];
351+ int n = 0 ;
352+ for (MimeMessage message : filteredMessages ) {
353+ Map <String , Object > headers = this .headerMapper .toHeaders (message );
354+ converted [n ++] =
355+ getMessageBuilderFactory ()
356+ .withPayload (extractContent (message , headers ))
357+ .copyHeaders (headers )
358+ .build ();
359+ }
360+ return converted ;
361+ }
362+ else {
363+ return filteredMessages ;
364+ }
365+ }
366+ finally {
367+ MailTransportUtils .closeFolder (this .folder , this .shouldDeleteMessages );
368+ }
369+ }
370+ finally {
371+ this .folderReadLock .unlock ();
372+ }
373+ }
374+
375+ private void obtainFolder () throws MessagingException {
344376 Folder folder = getFolder ();
345377 if (folder == null || !folder .isOpen ()) {
346378 this .folderReadLock .unlock ();
347379 this .folderWriteLock .lock ();
348380 try {
349381 openFolder ();
350- folder = getFolder ();
351382 this .folderReadLock .lock ();
352383 }
353384 finally {
354385 this .folderWriteLock .unlock ();
355386 }
356387 }
357- try {
358- if (this .logger .isInfoEnabled ()) {
359- this .logger .info ("attempting to receive mail from folder [" + folder .getFullName () + "]" );
360- }
361- Message [] messages = searchForNewMessages ();
362- if (this .maxFetchSize > 0 && messages .length > this .maxFetchSize ) {
363- Message [] reducedMessages = new Message [this .maxFetchSize ];
364- System .arraycopy (messages , 0 , reducedMessages , 0 , this .maxFetchSize );
365- messages = reducedMessages ;
366- }
367- if (this .logger .isDebugEnabled ()) {
368- this .logger .debug ("found " + messages .length + " new messages" );
369- }
370- if (messages .length > 0 ) {
371- fetchMessages (messages );
372- }
373-
374- if (this .logger .isDebugEnabled ()) {
375- this .logger .debug ("Received " + messages .length + " messages" );
376- }
388+ }
377389
378- MimeMessage [] filteredMessages = filterMessagesThruSelector (messages );
379-
380- postProcessFilteredMessages (filteredMessages );
381-
382- if (this .headerMapper != null ) {
383- org .springframework .messaging .Message <?>[] converted =
384- new org .springframework .messaging .Message <?>[filteredMessages .length ];
385- int n = 0 ;
386- for (MimeMessage message : filteredMessages ) {
387- Map <String , Object > headers = this .headerMapper .toHeaders (message );
388- converted [n ++] =
389- getMessageBuilderFactory ()
390- .withPayload (extractContent (message , headers ))
391- .copyHeaders (headers )
392- .build ();
393- }
394- return converted ;
395- }
396- else {
397- return filteredMessages ;
398- }
390+ private MimeMessage [] searchAndFilterMessages () throws MessagingException {
391+ if (this .logger .isInfoEnabled ()) {
392+ this .logger .info ("attempting to receive mail from folder [" + this .folder .getFullName () + "]" );
399393 }
400- finally {
401- MailTransportUtils .closeFolder (folder , this .shouldDeleteMessages );
402- this .folderReadLock .unlock ();
394+ Message [] messages = searchForNewMessages ();
395+ if (this .maxFetchSize > 0 && messages .length > this .maxFetchSize ) {
396+ Message [] reducedMessages = new Message [this .maxFetchSize ];
397+ System .arraycopy (messages , 0 , reducedMessages , 0 , this .maxFetchSize );
398+ messages = reducedMessages ;
399+ }
400+ if (this .logger .isDebugEnabled ()) {
401+ this .logger .debug ("found " + messages .length + " new messages" );
402+ }
403+ if (messages .length > 0 ) {
404+ fetchMessages (messages );
403405 }
406+
407+ if (this .logger .isDebugEnabled ()) {
408+ this .logger .debug ("Received " + messages .length + " messages" );
409+ }
410+
411+ MimeMessage [] filteredMessages = filterMessagesThruSelector (messages );
412+
413+ postProcessFilteredMessages (filteredMessages );
414+ return filteredMessages ;
404415 }
405416
406417 private Object extractContent (MimeMessage message , Map <String , Object > headers ) {
@@ -525,7 +536,6 @@ private MimeMessage[] filterMessagesThruSelector(Message[] messages) throws Mess
525536 * Fetches the specified messages from this receiver's folder. Default
526537 * implementation {@link Folder#fetch(Message[], FetchProfile) fetches}
527538 * every {@link javax.mail.FetchProfile.Item}.
528- *
529539 * @param messages the messages to fetch
530540 * @throws MessagingException in case of JavaMail errors
531541 */
@@ -539,7 +549,6 @@ protected void fetchMessages(Message[] messages) throws MessagingException {
539549
540550 /**
541551 * Deletes the given messages from this receiver's folder.
542- *
543552 * @param messages the messages to delete
544553 * @throws MessagingException in case of JavaMail errors
545554 */
@@ -552,7 +561,6 @@ protected void deleteMessages(Message[] messages) throws MessagingException {
552561 /**
553562 * Optional method allowing you to set additional flags.
554563 * Currently only implemented in IMapMailReceiver.
555- *
556564 * @param message The message.
557565 * @throws MessagingException A MessagingException.
558566 */
@@ -593,9 +601,10 @@ Store getStore() {
593601 * Since we copy the message to eagerly fetch the message, it has no folder.
594602 * However, we need to make a folder available in case the user wants to
595603 * perform operations on the message in the folder later in the flow.
604+ *
596605 * @author Gary Russell
597- * @since 2.2
598606 *
607+ * @since 2.2
599608 */
600609 private final class IntegrationMimeMessage extends MimeMessage {
601610
@@ -625,7 +634,7 @@ private final class IntegrationMimeMessage extends MimeMessage {
625634 @ Override
626635 public Folder getFolder () {
627636 try {
628- return AbstractMailReceiver . this . obtainFolderInstance ();
637+ return obtainFolderInstance ();
629638 }
630639 catch (MessagingException e ) {
631640 throw new org .springframework .messaging .MessagingException ("Unable to obtain the mail folder" , e );
0 commit comments