我们有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: body\n ${body}"/>
<to uri="micrometer:timer:camel.proxy.minifinder.getmessages.kafka?action=stop" />
</idempotentConsumer>
</when>
但我认为不应该退出任何配置来引发此异常。
Camel和Sping Boot 版本包括:
<camel.version>2.24.3</camel.version>
<spring-boot.version>2.1.8.RELEASE</spring-boot.version>
2条答案
按热度按时间kjthegm61#
您必须在
<when>
中具有表达式,因为这是必需的。但是,XML可能在没有XSD验证的情况下加载。sh7euo9m2#
它缺少了关键的部分:
没有它它仍然是有效的,但抛出了上述异常。但就我的理解,这个异常不应该抛出那里的任何类型的路由配置,即使不是有效的配置。