Apache Came error Из-за ref нужно указать на: process? - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь прочитать почтовый ящик и найти электронные письма, где в строке «Тема» содержится слово «ОШИБКА».

Если он находит электронное письмо, в котором нет слова «ОШИБКА» в строке темы, он должен перейти к процессу onException.

Это вроде работает до того момента, когда, я думаю, что оно пытается обработать, а затем я получаю ошибку.

public class MailRouteBuilder extends RouteBuilder {

   @Autowired
   ExceptionMailProcessor exceptionMailProcessor;

   @Override
   public void configure() throws Exception {
      String mailRouteStr = "imap://host.......";

      List<String> tmpKeywords = new ArrayList<>();
      tmpKeywords.add("ERROR"):

      onException(MailRouteException.class, RuntimeException.class).log(LoggingLevel.ERROR, "EXCEPTION in MAIL")
                .process(exceptionMailProcessor)
                .end();

      from(mailRouteStr).routeId("mymail")
             .validate(header("subject").in(tmpKeywords))
             .log("Sending to Mail Queue")
             .to("{{jmsMailIn}}")
             .log("Done with Mail Queue")
             .end();
    }
.
.
.

Мой класс ExceptionMailProcessor.

@Component
public class ExceptionMailProcessor implements Processor {

    @Override
    public void process(Exchange exchange) throws Exception {

        String messageBody;
        Exception e = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);

    }
}

Ошибка:

org.apache.camel.FailedToCreateRouteException: Failed to create route mymail at: >>> OnException[[class MailRouteException, class java.lang.RuntimeException] -> [Log[EXCEPTION in MAIL], process[Processor@0x0]]] <<< in route: Route(mymail)[[From[imap://mai... because of ref must be specified on: process[Processor@0x0]
    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1352)
    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:212)
    at org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:1140)
    at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:3735)
    at org.apache.camel.impl.DefaultCamelContext.addRouteDefinitions(DefaultCamelContext.java:1072)
    at org.apache.camel.builder.RouteBuilder.populateRoutes(RouteBuilder.java:478)
    at org.apache.camel.builder.RouteBuilder.addRoutesToCamelContext(RouteBuilder.java:391)
    at org.apache.camel.impl.DefaultCamelContext$3.call(DefaultCamelContext.java:1024)
    at org.apache.camel.impl.DefaultCamelContext$3.call(DefaultCamelContext.java:1021)
    at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3267)
    at org.apache.camel.impl.DefaultCamelContext.addRoutes(DefaultCamelContext.java:1021)
    at com.agile.net.international.mc360.routing.routebuilder.process.mail.MailRouteProcess.lambda$checkMailDataSourceRoutes$0(MailRouteProcess.java:135)
    at java.util.HashMap.forEach(HashMap.java:1289)
    at com.agile.net.international.mc360.routing.routebuilder.process.mail.MailRouteProcess.checkMailDataSourceRoutes(MailRouteProcess.java:131)
    at com.agile.net.international.mc360.routing.routebuilder.process.mail.MailRouteProcess.process(MailRouteProcess.java:60)
    at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
    at org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:197)
    at org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:79)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Caused by: java.lang.IllegalArgumentException: ref must be specified on: process[Processor@0x0]
    at org.apache.camel.util.ObjectHelper.notNull(ObjectHelper.java:340)
    at org.apache.camel.model.ProcessDefinition.createProcessor(ProcessDefinition.java:99)
    at org.apache.camel.model.ProcessorDefinition.createProcessor(ProcessorDefinition.java:518)
    at org.apache.camel.model.ProcessorDefinition.createOutputsProcessorImpl(ProcessorDefinition.java:481)
    at org.apache.camel.model.ProcessorDefinition.createOutputsProcessor(ProcessorDefinition.java:448)
    at org.apache.camel.model.ProcessorDefinition.createOutputsProcessor(ProcessorDefinition.java:186)
    at org.apache.camel.model.OnExceptionDefinition.addRoutes(OnExceptionDefinition.java:210)
    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1349)
    ... 22 more

Класс MailRouteProcess в ошибке именно там, где я строю свою строку imap и добавляю ее в контекст верблюда.

Все, что я хочу, - это когда в случае сбоя Маршрута он переходит к ExceptionMailProcessor. Там я сделаю кое-что, и реальное почтовое сообщение должно быть помечено как READ и больше не обрабатываться.

1 Ответ

1 голос
/ 14 мая 2019

Вместо того, чтобы пытаться автоматически связывать в экземпляре вашего ExceptionMailProcessor, попробуйте ссылаться на него как на bean-компонент в DSL. Обычно для своих процессоров в Camel я использую класс Spring Configuration, чтобы зарегистрировать процессоры как компоненты и затем ссылаться на них в DSL:

@Configuration
public class AppConfig {

  @Bean(name = "ExceptionMailProcessor ")
  public ExceptionMailProcessor exceptionMailProcessor() {
    return new ExceptionMailProcessor();
  }
}

Тогда в вашем Camel DSL вы можете ссылаться на него так:

onException(MailRouteException.class, RuntimeException.class).log(LoggingLevel.ERROR, "EXCEPTION in MAIL")
                .to("bean:ExceptionMailProcessor")
                .end();
...