#java #apache-camel
Вопрос:
У нас есть NPE на линии coe, упомянутой в теме, когда мы запрашиваем
RoutesDefinition routesDefinition=context.loadRoutesDefinition(new ByteArrayInputStream(value.getBytes(StandardCharsets.UTF_8)));
в Apache Camel. Т. е. при загрузке маршрута из XML-конфигурации. Ясно, что проблема, вызвавшая исключение, заключается в каком-то неясном изменении XML, которое все еще делает его действительным, но каким-то образом приводит к сбою. Я считаю, что сообщение об ошибке должно быть выдано раньше, когда будет проверена согласованность XML. Теперь это своего рода исключение во время выполнения.
Полный маршрут стека-это:
13:35:01.768 [main] ERROR s.services.XMLRouteServiceImpl - Could not restart source
java.lang.NullPointerException: null
at org.apache.camel.model.ModelHelper.getNamespaceAwareFromExpression(ModelHelper.java:263)
at org.apache.camel.model.ModelHelper.applyNamespaces(ModelHelper.java:252)
at org.apache.camel.model.ModelHelper.loadRoutesDefinition(ModelHelper.java:188)
at org.apache.camel.model.ModelHelper.loadRoutesDefinition(ModelHelper.java:153)
at org.apache.camel.impl.DefaultCamelContext.loadRoutesDefinition(DefaultCamelContext.java:1030)
at sekaicamelproxy.builders.XMLCamelRouteBuilder.<init>(XMLCamelRouteBuilder.java:31)
at sekaicamelproxy.services.XMLRouteServiceImpl.restartSource(XMLRouteServiceImpl.java:59)
at io.vavr.Value.forEach(Value.java:340)
at sekaicamelproxy.services.XMLRouteServiceImpl.restartAllRoutes(XMLRouteServiceImpl.java:177)
at sekaicamelproxy.services.XMLRouteServiceImpl$FastClassBySpringCGLIB$f0155a48.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at sekaicamelproxy.services.XMLRouteServiceImpl$EnhancerBySpringCGLIB$38f84a05.restartAllRoutes(<generated>)
at sekaicamelproxy.MqttToKafkaProxy.initializeRoutes(MqttToKafkaProxy.java:31)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:261)
at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:179)
at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:142)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359)
at org.springframework.boot.context.event.EventPublishingRunListener.running(EventPublishingRunListener.java:105)
at org.springframework.boot.SpringApplicationRunListeners.running(SpringApplicationRunListeners.java:78)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:332)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
at sekaicamelproxy.Application.main(Application.java:10)
Важнейшей частью маршрута является:
<when>
<log message="Processing as sattelites are more than 0"/>
<setHeader headerName="timestamp">
<jsonpath>$.t</jsonpath>
</setHeader>
<setHeader headerName="messageId">
<simple>${header.unit_id}-${header.timestamp}</simple>
</setHeader>
<setHeader headerName="kafka.KEY">
<simple resultType="java.lang.String">${header.unit_id}</simple>
</setHeader>
<idempotentConsumer messageIdRepositoryRef="deduplicationRepo">
<header>messageId</header>
<removeHeaders pattern="*" excludePattern="messageId|kafka.KEY"/>
<to uri="micrometer:timer:camel.proxy.minifinder.getmessages.kafka?action=start" />
<log message="Deduplicated: bodyn ${body}"/>
<to uri="micrometer:timer:camel.proxy.minifinder.getmessages.kafka?action=stop" />
</idempotentConsumer>
</when>
Но я считаю, что никакая конфигурация не должна выходить, чтобы создать это исключение.
Версии Camel и Spring Boot являются:
<camel.version>2.24.3</camel.version>
<spring-boot.version>2.1.8.RELEASE</spring-boot.version>
Комментарии:
1. Какую версию Camel вы используете?
2. 2.24.3. Я обновил вопрос
Ответ №1:
У вас должно быть выражение в том <when>
виде, в каком оно требуется. Однако XML, скорее всего, загружается без проверки XSD.
Ответ №2:
В нем отсутствовала ключевая часть :
<when>
<simple>${header.sattelitesCount} > 0</simple>
Без этого он все еще был действителен, но выбросил исключение выше. Но, насколько я понимаю, это исключение не должно создаваться для какой-либо конфигурации маршрута, даже для допустимой конфигурации.
Комментарии:
1. Если вы обнаружили ошибку, сделайте вопрос вики или удалите его, спасибо.
2. нет, до сих пор неясно, почему исключение создается для конкретной конфигурации xml, поскольку оно не должно этого достигать. Итак, что-то не так с загрузкой объекта выражения в org.apache.camel.model. Помощник по моделированию для данного конкретного маршрута. В любом случае, я жду еще несколько комментариев от @Claus Ibsen
3. извини, это моя вина.
4. Я не могу, пока ты не отредактируешь свой вопрос. Просто отредактируйте его, и я подам голос, извините за неудобства.
5. готово, еще раз приношу извинения за причиненные неудобства