概念
之前有介绍过有 2 种方式可以对 Endpoint 进行属性配置,分别是传入 map 和 url 参数,如下
1 2 3 4 5 6 7
| TimerComponent component= (TimerComponent)context.getComponent("timer");
Map<String, Object> properties=new HashMap<>(); properties.put("period","5s"); Endpoint endpoint=component.createEndpoint("timer:foo",properties);
Endpoint endpoint=component.createEndpoint("timer:foo?period=5s");
|
除上面方式之外,还可以通过 PropertyConfigurer 对 Component 和 Endpoint 进行属性通用设置
接口定义
1 2 3 4 5 6 7 8 9 10 11 12
| public interface Component {
PropertyConfigurer getComponentPropertyConfigurer(); PropertyConfigurer getEndpointPropertyConfigurer();
}
public interface PropertyConfigurer {
boolean configure(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase);
}
|
Component 接口对 Component 和 Endpoint 定义了 2 个 PropertyConfigurer,这意味着可以通过这 2 个方法对 Component 和 Endpoint 进行属性设置
- TimerComponentConfigurer 和 TimerEndpointConfigurer 定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class TimerComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
@Override public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { TimerComponent target = (TimerComponent) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "autowiredenabled": case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true; default: return false; } } }
public class TimerEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
@Override public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { TimerEndpoint target = (TimerEndpoint) obj; switch (ignoreCase ? name.toLowerCase() : name) {
case "period": target.setPeriod(property(camelContext, java.time.Duration.class, value).toMillis()); return true; case "time": target.setTime(property(camelContext, java.util.Date.class, value)); return true; case "timer": target.setTimer(property(camelContext, java.util.Timer.class, value)); return true; default: return false; } } }
|
- 调用示例
1 2 3 4 5 6 7 8 9 10 11
| @Test public void test() throws Exception { CamelContext context=new DefaultCamelContext(); Component component=context.getComponent("timer"); Endpoint endpoint=component.createEndpoint("timer:foo?period=5s"); component.getComponentPropertyConfigurer() .configure(context,component, "autowiredEnabled",false,false); component.getEndpointPropertyConfigurer() .configure(context,endpoint,"period","3s",false); }
|