2014-11-07 3 views
0

Я новичок в интеграции Spring и Spring, и у меня есть простая задача. Фильтрация некоторых электронных писем по теме, хотя регулярное выражение и регистрация информации в db.Весенний интеграционный почтовый входящий канал

Я установил JavaMailProperties, и тест дает мне вывод прочитанных писем, но метод, который я устанавливаю с помощью service-activator, никогда не вызывается, и это на самом деле заставляет меня сильную головную боль.

Ниже файл конфигурации XML:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:mail="http://www.springframework.org/schema/integration/mail" 
     xmlns:int="http://www.springframework.org/schema/integration" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
       http://www.springframework.org/schema/integration/mail 
       http://www.springframework.org/schema/integration/mail/spring-integration-mail-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 
<util:properties id="javaMailProperties"> 
     <prop key="mail.store.protocol">pop3</prop> 
     <prop key="mail.debug">true</prop> 
    </util:properties> 
    <mail:inbound-channel-adapter id="pop3Adapter" 
             store-uri="pop3://username:[email protected]:110/INBOX"          
             channel="recieveEmailChannel"           
             should-delete-messages="false"         
             auto-startup="true" 
             java-mail-properties="javaMailProperties" 
             mail-filter-expression="subject matches '(^Presente+\\s([1-9]{1})+(\\s[-]\\s)+([A-Z]{4,})+(\\s[A-Z]{6,})$)'"> 
     <int:poller max-messages-per-poll="10" fixed-delay="10000"/> 
    </mail:inbound-channel-adapter> 
    <int:channel id="recieveEmailChannel">   
     <int:interceptors> 
      <int:wire-tap channel="logger"/> 
     </int:interceptors> 
    </int:channel> 
    <int:logging-channel-adapter id="logger" level="DEBUG"/> 
    <int:service-activator input-channel="recieveEmailChannel" ref="leggiMail" method="processa_mail"/> 
    <bean id="leggiMail" class="it.jenia.ac.mail.rapportini.LeggiMail"> 
    </bean> 
</beans> 

LeggiMail класс с методом processa_mail очень прост:

import org.springframework.integration.annotation.ServiceActivator; 
import org.springframework.stereotype.Service; 

@Service 
public class LeggiMail { 
    private static Logger logger = Logger.getLogger(LeggiMail.class); 
    public static int count_get = 0; 
    @ServiceActivator 
    public void processa_mail(MimeMessage mimeMessage) { 
     count_get++; 
     logger.debug("porcessa_mail working"); 
    } 

Тест класс я использую это приложение в:

@ContextConfiguration(locations = { "classpath*:/test-spring-configuration.xml" }) 
@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class }) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false) 
public class LeggiMailTest { 
    private static Logger logger = Logger.getLogger(LeggiMailTest.class); 
    @Autowired 
    LeggiMail lm; 
    @Test 
    @Transactional(value = "transactionManager", propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class) 
    public void test_processa_mail(){ 
     logger.debug("Test started"); 
    } 
} 

Журнал Test started отображается правильно в консоль, но журнал porcessa_mail working никогда не появляется.

Первый учебник, который я нашел на эту тему, просто рассказал о методе, который был бы вызван по умолчанию контекстом. http://blog.solidcraft.eu/2011/04/read-emails-from-imap-with-spring.html (И это говорит о том, что метод «processa_mail» должен называться по умолчанию, когда контекст загружен, потому что это service-activator

Читая этот учебник о службе активаторе не помогло достаточно:. http://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html

+1

И почему это должно быть названо. Приложение запускается и останавливается после этого, если я прав. Также мне интересно, почему вы загружаете 2 контекста и делаете это хуже, вы смешиваете 2 боба из разных контекстов ... На первый взгляд, я бы сказал, что ваш тест испорчен. –

+0

В соответствии с этим (http://blog.solidcraft.eu/2011/04/read-emails-from-imap-with-spring.html) учебником метод следует вызывать по умолчанию. Я не совсем понимаю, почему, но, возможно, я могу попросить вас вызывать метод «после» чтения электронных писем? – softwareplay

+0

Я просто не могу понять процедуру «между ними». – softwareplay

ответ

1

Когда ты попытаться проверить некоторые async вещей вы некоторые barrier, чтобы предотвратить main нити будете остановлены раньше, чем для всего необходимому теста-случае.

самых простого способа добавить Thread.sleep() до конца метода испытаний.

Но лучшее решение основано на некоторых synchonizer, например CountDonwLatch.

С другой стороны - QueueChannel Весенняя интеграция. Вы можете использовать его как output-channel для <service-activator>. Внесите его в тестовый класс и подождите output.receive(10000). И сообщение assert..., чтобы сделать ваш тестовый блок-тест.

Смежные вопросы