[Camel]Using spring.xml to Walk through an Example

本文介绍了一个使用Apache Camel的示例,展示了如何通过spring.xml配置文件定义路由,从JMS队列接收消息并写入文件系统的过程。此外还提供了Java代码用于启动Camel上下文并发送测试消息。

Walk through an Example:

http://cwiki.apache.org/confluence/display/CAMEL/Walk+through+an+Example

springExampleUsingNamespaces.xml

使用spring.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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd
">


<!-- START SNIPPET: example -->
<camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring">
<route>
<from uri="test-jms:queue:test.queue"/>
<process ref="logger"/>
<to uri="file:target/data"/>
<process ref="logger"/>
</route>
</camelContext>

<bean id="logger" class="org.apache.camel.processor.Logger"/>

<bean id="test-jms" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="vm://localhost?broker.persistent=false"/>
</bean>
</property>
</bean>

<!-- END SNIPPET: example -->

</beans>

 

Main.java


1.创建一个CamelContext;
2. 在CamelContext中发送对象(本例为文字),发送到的Component为test-jms:queue:test.queue.

public class Main {

public static void main(String args[]) throws Exception {

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"org/apache/camel/example/spring/springExampleUsingNamespaces.xml");

SpringCamelContext camelContext = (SpringCamelContext) applicationContext
.getBean("camel");

CamelTemplate template = new CamelTemplate(camelContext);
camelContext.start();

template.sendBody("test-jms:queue:test.queue", "Test Message" );

Thread.sleep(1000);
camelContext.stop();
}
}
 
分析下面错误原因:500 Internal Server Error: [org.apache.camel.RuntimeExchangeException: Cannot find key [pmar002] in message body or headers to use when setting named parameter in query [select pmar002,pmar014,pmar012,pmar019 from pmar_t where pmar002 = :?pmar002 and pmarsite =:?pmarsite and rownum = 1 order by pmar019 desc] on the exchange: Exchange[83755b1fd6c241998ee04f7642a91e7a] at org.apache.camel.component.sql.DefaultSqlPrepareStatementStrategy$PopulateIterator.next(DefaultSqlPrepareStatementStrategy.java:387) at org.apache.camel.component.sql.DefaultSqlPrepareStatementStrategy.populateStatement(DefaultSqlPrepareStatementStrategy.java:191) at org.apache.camel.component.sql.SqlProducer.populateStatement(SqlProducer.java:301) at org.apache.camel.component.sql.SqlProducer.access$000(SqlProducer.java:21) at org.apache.camel.component.sql.SqlProducer$1.doInPreparedStatement(SqlProducer.java:144) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:650) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:687) at org.apache.camel.component.sql.SqlProducer.processInternal(SqlProducer.java:138) at org.apache.camel.component.sql.SqlProducer.process(SqlProducer.java:121) at org.apache.camel.support.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.processNext(AsyncProcessorConverterHelper.java:101) at org.apache.camel.support.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:96) at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:191) at org.apache.camel.impl.engine.SharedCamelInternalProcessor$1.process(SharedCamelInternalProcessor.java:111) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83) at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:108) at org.apache.camel.support.cache.DefaultProducerCache.send(DefaultProducerCache.java:199) at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:176) at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:148) at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:131) at com.definesys.deipaas.camel.component.sql.dynamic.database.builder.ExecuteRouteBuilder.lambda$configure$0(ExecuteRouteBuilder.java:56) at org.apache.camel.support.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:85) at com.definesys.deipaas.apiflow.runtime.framework.camel.core.LoopInterceptStrategy$LoopInterceptor.process(LoopInterceptStrategy.java:46) at org.apache.camel.support.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:104) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:481) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeFromQueue(DefaultReactiveExecutor.java:224) at org.apache.camel.impl.engine.DefaultReactiveExecutor.executeFromQueue(DefaultReactiveExecutor.java:82) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:96) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:85) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:205) at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:370) at org.apache.camel.processor.Pipeline$PipelineTask.run(Pipeline.java:109) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeFromQueue(DefaultReactiveExecutor.java:224) at org.apache.camel.impl.engine.DefaultReactiveExecutor.executeFromQueue(DefaultReactiveExecutor.java:82) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:96) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:85) at org.apache.camel.spring.spi.TransactionErrorHandler.processByErrorHandler(TransactionErrorHandler.java:244) at org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:119) at com.definesys.deipaas.apiflow.runtime.framework.camel.core.LoopInterceptStrategy$LoopInterceptor.process(LoopInterceptStrategy.java:46) at org.apache.camel.support.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:104) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:481) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeFromQueue(DefaultReactiveExecutor.java:224) at org.apache.camel.impl.engine.DefaultReactiveExecutor.executeFromQueue(DefaultReactiveExecutor.java:82) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:96) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:85) at org.apache.camel.spring.spi.TransactionErrorHandler.processByErrorHandler(TransactionErrorHandler.java:244) at org.apache.camel.spring.spi.TransactionErrorHandler$1.doInTransactionWithoutResult(TransactionErrorHandler.java:207) at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:36) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) at org.apache.camel.spring.spi.TransactionErrorHandler.doInTransactionTemplate(TransactionErrorHandler.java:200) at org.apache.camel.spring.spi.TransactionErrorHandler.processInTransaction(TransactionErrorHandler.java:155) at org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:123) at org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:132) at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:398) at org.apache.camel.processor.Pipeline$PipelineTask.run(Pipeline.java:109) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeFromQueue(DefaultReactiveExecutor.java:224) at org.apache.camel.impl.engine.DefaultReactiveExecutor.executeFromQueue(DefaultReactiveExecutor.java:82) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:96) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:85) at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:108) at org.apache.camel.support.cache.DefaultProducerCache.send(DefaultProducerCache.java:199) at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:176) at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:148) at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:131) at com.definesys.deipaas.camel.component.sql.dynamic.database.AbstractDatabase.invokeDirectRoute(AbstractDatabase.java:116) at com.definesys.deipaas.camel.component.sql.dynamic.database.AbstractDatabase.invokeDynamicRoute(AbstractDatabase.java:85) at com.definesys.deipaas.camel.component.sql.dynamic.SqlDynamicProducer.process(SqlDynamicProducer.java:17) at org.apache.camel.support.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:66) at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:172) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83) at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:41) at com.definesys.deipaas.apiflow.runtime.framework.camel.core.LoopInterceptStrategy$LoopInterceptor.process(LoopInterceptStrategy.java:46) at org.apache.camel.support.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:104) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:481) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeFromQueue(DefaultReactiveExecutor.java:224) at org.apache.camel.impl.engine.DefaultReactiveExecutor.executeFromQueue(DefaultReactiveExecutor.java:82) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:96) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:85) at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:41) at com.definesys.deipaas.apiflow.runtime.framework.camel.core.LoopInterceptStrategy$LoopInterceptor.process(LoopInterceptStrategy.java:46) at org.apache.camel.support.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:104) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:481) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:193) at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:64) at org.apache.camel.processor.Pipeline.process(Pipeline.java:189) at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:398) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83) at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:41) at org.apache.camel.component.undertow.UndertowConsumer.handleRequest(UndertowConsumer.java:270) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:393) at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852) at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449) at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282) at java.lang.Thread.run(Thread.java:748) ]
08-21
<think>首先,用户要求使用中文回答问题。所以,我所有的响应都必须用中文。 问题:分析下面错误原因:500 Internal Server Error: [org.apache.camel.RuntimeExchangeException: Cannot find key [pmar002] in message body or headers to use when setting named parameter in query [select pmar002,pmar014,pmar012,pmar019 from pmar_t where pmar002 = :?pmar002 and pmarsite =:?pmarsite and rownum = 1 order by pmar019 desc] on the exchange: Exchange[83755b1fd6c241998ee04f7642a91e7a] 错误堆栈显示了Apache Camel的异常,核心问题是:在设置SQL查询中的命名参数时,找不到键[pmar002]在消息体或头部中。 关键点: - 异常类型:org.apache.camel.RuntimeExchangeException - 消息:Cannot find key [pmar002] in message body or headers - SQL查询:select pmar002,pmar014,pmar012,pmar019 from pmar_t where pmar002 = :?pmar002 and pmarsite =:?pmarsite and rownum = 1 order by pmar019 desc - 参数::?pmar002 和 :?pmarsite 是命名参数。 - 错误发生在尝试设置这些参数时。 原因分析: 1. **参数缺失**:在Camel Exchange(消息交换)中,没有找到名为"pmar002"的键。这意味着在消息体或头部中,缺少这个参数。 2. **SQL组件行为**:Apache Camel的SQL组件使用命名参数(如 :?paramName),它需要从Exchange中提取这些值。如果键不存在,就会抛出此异常。 3. **上下文**:从堆栈看,错误发生在com.definesys.deipaas.camel.component.sql.dynamic.database.builder.ExecuteRouteBuilder中,表明是自定义的SQL组件在处理动态SQL。 4. **潜在原因**: - 输入数据中没有提供"pmar002"参数。 - 参数名拼写错误或大小写不匹配。 - 数据源(如HTTP请求)没有正确传递参数。 - 路由配置错误,导致参数未被正确设置。 修复建议: - 检查传入Exchange的数据,确保包含"pmar002"和"pmarsite"键。 - 验证SQL查询中的参数名是否与数据中的键一致。 - 添加日志以查看Exchange的内容,调试参数缺失的原因。 现在,我需要根据规则回答完问题后,提出3-5个相关问题。问题必须以"§§相关问题§§"开头,并在同一行输出,禁止换行分散。格式如示例所示。 相关问题应基于用户的问题和我的回答: - 用户问题:分析错误原因。 - 我的回答:关于参数缺失导致SQL参数设置失败。 所以,相关问题可能包括: 1. 如何在Apache Camel中正确设置SQL查询的参数? 2. 如何确保Exchange中包含所有必需的键? 3. 调试Camel路由中参数缺失的常见方法是什么? 4. Apache Camel的SQL组件如何处理命名参数? 5. 如何避免类似的RuntimeExchangeException? 我需要提出3-5个,确保在末尾输出。 完整响应结构: - 先回答问题(用中文)。 - 然后输出"§§相关问题§§",后跟问题列表,用数字编号。 确保所有内容符合规则。 最终响应: - 分析错误原因。 - 输出"§§相关问题§§"。 - 列出3-5个相关问题。</think>### 分析错误原因 该错误的核心原因是 **SQL 查询参数缺失**。具体来说,在 Apache Camel 路由中执行动态 SQL 查询时,系统尝试使用命名参数(如 `:?pmar002`)从消息交换(Exchange)中提取值,但未在消息体或头部中找到对应的键 `pmar002`,导致抛出 `org.apache.camel.RuntimeExchangeException`。以下是详细分析: 1. **错误根源**: - SQL 查询语句为: ```sql select pmar002,pmar014,pmar012,pmar019 from pmar_t where pmar002 = :?pmar002 and pmarsite =:?pmarsite and rownum = 1 order by pmar019 desc ``` - 其中 `:?pmar002` 和 `:?pmarsite` 是命名参数,需要从 Exchange 中获取值。 - 异常信息 `Cannot find key [pmar002] in message body or headers` 表明:Camel 的 SQL 组件(`DefaultSqlPrepareStatementStrategy`)在 Exchange 中搜索键 `pmar002` 失败。Exchange 是消息传递的核心对象,包含消息体(Body)和头部(Headers),但此处缺少必要的参数。 2. **上下文分析**: - 堆栈追踪显示错误发生在 `com.definesys.deipaas.camel.component.sql.dynamic.database.builder.ExecuteRouteBuilder`(自定义动态 SQL 组件),表明该路由用于构建和执行 SQL 查询。 - Camel SQL 组件要求所有命名参数(如 `:?xxx`)必须在 Exchange 中存在对应键。如果键缺失,组件无法绑定参数值,从而中断查询执行。 3. **常见原因**: - **输入数据不完整**:外部请求(如 HTTP 调用)未提供 `pmar002` 参数,或参数名拼写错误(例如大小写不匹配)。 - **路由配置问题**:前置处理器未正确设置 Exchange 中的键值,或数据转换(如 JSON 解析)失败导致参数丢失。 - **并发或缓存问题**:Exchange ID `83755b1fd6c241998ee04f7642a91e7a` 可能涉及共享状态,导致参数在特定交换中未被注入。 4. **修复方向建议**: - 检查传入请求的数据源(如 HTTP Body/Headers),确保包含 `pmar002` 和 `pmarsite` 键值。 -Camel 路由中添加调试日志,输出 Exchange 内容(例如使用 `log:DEBUG` 组件),确认参数是否存在。 - 验证 SQL 查询定义,确保参数名与 Exchange 键名完全一致(包括大小写)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值