2015-06-01 1 views
2

Я использую конфигурацию Spring Integration (4.1) для извлечения сообщения из БД в виде пакета больше, чем как сервис. Я знаю, что у меня будет десяток сообщений для ежедневной обработки, поэтому мне нужно запустить пакет один раз в день.Выход из интеграции Spring, когда больше нет сообщений

My jdbc: входящий канал-адаптер настроен на получение max-rows-per-poll = "1". Я хотел бы получить уведомление в некотором роде, когда сообщений больше нет, так что я могу выйти из пакета, но у меня есть проблемы с поиском, где «подключиться». Я попытался с помощью перехватчика, который запоминает, когда прошло последнее сообщение + запланированное задание, которое извлекает эту метку времени и проверяет, не превышает ли это установленный тайм-аут, но это было очень громоздким и вместо этого пыталось использовать AOP, что кажется лучшим решением.

Я бы хотел перехватить вызов AbstractPollingEndpoint.doPoll(), который возвращает false, когда нет сообщения, но я не могу найти способ сделать это: я пробовал подклассию AbstractRequestHandlerAdvice, но это не работает, когда применяется на poller (это говорит мне так в журналах). Теперь я пытаюсь реализовать MethodInterceptor и настройки, как показано ниже, и я вижу, что я могу перехватить вызов «вызов» метод, но я не уверен, что это правильный путь

<int:poller default="true" trigger="periodicTriggerWithInitialDelay"> 
    <int:advice-chain>   
     <bean class="com.myBatch.NoMoreMessageNotifierAdvice" /> 
     <ref bean="txAdvice"/> 
    </int:advice-chain> 
</int:poller> 

Нет ли проще способ сделать это? Основная трудность, как указано здесь http://forum.spring.io/forum/spring-projects/integration/127410-poller-with-advice-chain, заключается в том, что на данном этапе у нас нет сообщений для работы.

Благодаря

Винсент

ответ

0

Похоже, я был очень близок к ответу на самом деле .. Так как у меня есть доступ к результату метода вызова, все, что мне нужно сделать, это бросить исключение, если результат является ложным, наряду с XML-конфигурации от вопроса:

общественного класса NoMoreMessageNotifierAdvice реализует MethodInterceptor {

@Override 
public Object invoke(MethodInvocation invocation) throws Throwable { 

    Object result=invocation.proceed(); 

    if(result instanceof Boolean){ 

     boolean hasPolledAMessage=(Boolean)result; 

     if(hasPolledAMessage){ 
      return true; 
     } 
     else{ 
      throw new StopBatchException("no message was received on latest poll -> throwing exception to exit"); 
     }  
    } 

    return result; 
} 

}

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