Apache Camel Salesforce组件:如何启动带独立连接参数的多路由?
问题
需要使用Apache Camel的SalesforceComponent连接多个Salesforce实例,各实例的连接参数(clientId、secret等)仅在运行时可用且互不相同。请问如何在运行时配置这些参数,并创建多个可并行运行的路由?
尝试创建该组件的独立实例,但未生效,系统始终读取application.properties中的配置,代码示例如下:
SalesforceComponent salesforce = new SalesforceComponent(camelContext); salesforce.setLoginUrl("https://login.salesforce.com"); salesforce.setClientId("XXXXXXX"); salesforce.setRefreshToken("XXXXXXXXXXXXXX"); salesforce.setClientSecret("CCCCCCCCCCCC"); salesforce.setAuthenticationType(AuthenticationType.REFRESH_TOKEN);
使用环境:Spring Boot(2.7.2)、Camel(2.19.0),该问题与Stack Overflow上的《Camel Salesforce - Multiple Components Configurations》问题类似。
补充细节:添加命名为salesforcev2的新组件实例时,出现空指针异常:
camelContext.addComponent("salesforcev2", component); producerTemplate.requestBody("direct:my-route", "hello", String.class);
异常堆栈:
Caused by: org.apache.camel.FailedToCreateProducerException: Failed to create Producer for endpoint: salesforcev2://query?sObjectClass=com.salesforce.dto.QueryRecordsCase&sObjectQuery=SELECT+Id%2C+Subject+FROM+Case. Reason: java.lang.NullPointerException at org.apache.camel.impl.ProducerCache.doGetProducer(ProducerCache.java:579) ~[camel-core-2.19.0.jar:2.19.0] .... Caused by: java.lang.NullPointerException: null at org.apache.camel.component.salesforce.internal.client.AbstractClientBase.start(AbstractClientBase.java:91) ~[camel-salesforce-2.19.0.jar:2.19.0] at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75) ~[camel-core-2.19.0.jar:2.19.0]
对应的路由代码:
from("direct:my-route") .to("salesforcev2:query?sObjectQuery=SELECT Id, Subject FROM Case&sObjectClass=com.salesforce.dto.QueryRecordsCase") .streamCaching() .to("log:my-log");
解决方案
1. 规避Spring自动配置的默认组件
Spring Boot环境下,Camel会自动根据application.properties创建默认SalesforceComponent实例。要自定义多组件,需确保:
- 自定义组件使用唯一名称,不与默认的
salesforce组件冲突 - 若不需要默认组件,可通过
@SpringBootApplication(exclude = SalesforceAutoConfiguration.class)禁用自动配置
2. 正确初始化并注册自定义组件
之前的空指针异常是因为组件未完成完整初始化流程(缺少init()和start()步骤),且Camel 2.19.0版本需要显式设置API版本,正确代码如下:
// 创建自定义组件实例 SalesforceComponent salesforceV2Component = new SalesforceComponent(camelContext); // 设置所有必填连接参数 salesforceV2Component.setLoginUrl("https://login.salesforce.com"); salesforceV2Component.setClientId("你的客户端ID"); salesforceV2Component.setRefreshToken("你的刷新令牌"); salesforceV2Component.setClientSecret("你的客户端密钥"); salesforceV2Component.setAuthenticationType(AuthenticationType.REFRESH_TOKEN); // 显式设置API版本(Camel 2.19.0版本必填,否则会触发NPE) salesforceV2Component.setApiVersion("58.0"); // 初始化并启动组件 try { salesforceV2Component.init(); salesforceV2Component.start(); } catch (Exception e) { throw new RuntimeException("初始化Salesforce组件失败", e); } // 将组件注册到Camel上下文,使用唯一名称 camelContext.addComponent("salesforcev2", salesforceV2Component);
3. 确保路由与组件名称匹配
路由端点的前缀必须和注册的组件名称完全一致,比如使用salesforcev2://query,同时确认sObjectClass、sObjectQuery等参数配置正确。
4. 运行时动态创建多实例路由
如果需要根据运行时获取的配置批量创建路由,可通过动态构建RouteBuilder实现:
// 假设从外部获取多实例配置列表 List<SalesforceInstanceConfig> configList = getRuntimeSalesforceConfigs(); for (SalesforceInstanceConfig config : configList) { // 创建对应组件 SalesforceComponent component = new SalesforceComponent(camelContext); component.setLoginUrl(config.getLoginUrl()); component.setClientId(config.getClientId()); component.setRefreshToken(config.getRefreshToken()); component.setClientSecret(config.getClientSecret()); component.setAuthenticationType(AuthenticationType.REFRESH_TOKEN); component.setApiVersion(config.getApiVersion()); component.init(); component.start(); String componentName = "salesforce-" + config.getInstanceId(); camelContext.addComponent(componentName, component); // 动态添加路由 camelContext.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:" + componentName + "-query") .to(componentName + ":query?sObjectQuery=SELECT Id, Subject FROM Case&sObjectClass=com.salesforce.dto.QueryRecordsCase") .streamCaching() .to("log:" + componentName + "-result"); } }); }
5. Spring Boot环境注意事项
- 使用
@PostConstruct注解的方法注册组件,确保在Camel上下文初始化完成后执行 - 若使用
@Autowired注入CamelContext,需确保上下文已完全启动
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

