@@ -341,66 +341,77 @@ private Folder obtainFolderInstance() throws MessagingException {
341
341
@ Override
342
342
public Object [] receive () throws javax .mail .MessagingException {
343
343
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 {
344
376
Folder folder = getFolder ();
345
377
if (folder == null || !folder .isOpen ()) {
346
378
this .folderReadLock .unlock ();
347
379
this .folderWriteLock .lock ();
348
380
try {
349
381
openFolder ();
350
- folder = getFolder ();
351
382
this .folderReadLock .lock ();
352
383
}
353
384
finally {
354
385
this .folderWriteLock .unlock ();
355
386
}
356
387
}
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
+ }
377
389
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 () + "]" );
399
393
}
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 );
403
405
}
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 ;
404
415
}
405
416
406
417
private Object extractContent (MimeMessage message , Map <String , Object > headers ) {
@@ -525,7 +536,6 @@ private MimeMessage[] filterMessagesThruSelector(Message[] messages) throws Mess
525
536
* Fetches the specified messages from this receiver's folder. Default
526
537
* implementation {@link Folder#fetch(Message[], FetchProfile) fetches}
527
538
* every {@link javax.mail.FetchProfile.Item}.
528
- *
529
539
* @param messages the messages to fetch
530
540
* @throws MessagingException in case of JavaMail errors
531
541
*/
@@ -539,7 +549,6 @@ protected void fetchMessages(Message[] messages) throws MessagingException {
539
549
540
550
/**
541
551
* Deletes the given messages from this receiver's folder.
542
- *
543
552
* @param messages the messages to delete
544
553
* @throws MessagingException in case of JavaMail errors
545
554
*/
@@ -552,7 +561,6 @@ protected void deleteMessages(Message[] messages) throws MessagingException {
552
561
/**
553
562
* Optional method allowing you to set additional flags.
554
563
* Currently only implemented in IMapMailReceiver.
555
- *
556
564
* @param message The message.
557
565
* @throws MessagingException A MessagingException.
558
566
*/
@@ -593,9 +601,10 @@ Store getStore() {
593
601
* Since we copy the message to eagerly fetch the message, it has no folder.
594
602
* However, we need to make a folder available in case the user wants to
595
603
* perform operations on the message in the folder later in the flow.
604
+ *
596
605
* @author Gary Russell
597
- * @since 2.2
598
606
*
607
+ * @since 2.2
599
608
*/
600
609
private final class IntegrationMimeMessage extends MimeMessage {
601
610
@@ -625,7 +634,7 @@ private final class IntegrationMimeMessage extends MimeMessage {
625
634
@ Override
626
635
public Folder getFolder () {
627
636
try {
628
- return AbstractMailReceiver . this . obtainFolderInstance ();
637
+ return obtainFolderInstance ();
629
638
}
630
639
catch (MessagingException e ) {
631
640
throw new org .springframework .messaging .MessagingException ("Unable to obtain the mail folder" , e );
0 commit comments