camel系列-PropertyConfigurer

概念

之前有介绍过有 2 种方式可以对 Endpoint 进行属性配置,分别是传入 map 和 url 参数,如下

1
2
3
4
5
6
7
TimerComponent component= (TimerComponent)context.getComponent("timer");
//使用map传入
Map<String, Object> properties=new HashMap<>();
properties.put("period","5s");
Endpoint endpoint=component.createEndpoint("timer:foo",properties);
//使用url参数传入
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 示例

  1. 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. 调用示例
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);
}

PropertyConfigurerGetter

PropertyConfigurer 是对属性进行配置,PropertyConfigurerGetter 则是对属性进行读取

1
2
3
4
5
public interface PropertyConfigurerGetter {
Class<?> getOptionType(String name, boolean ignoreCase);
Object getOptionValue(Object target, String name, boolean ignoreCase);

}

示例

  1. 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
public class TimerComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {

@Override
public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
TimerComponent target = (TimerComponent) obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "autowiredenabled":
case "autowiredEnabled": return target.isAutowiredEnabled();
default: return null;
}
}
}

public class TimerEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {

@Override
public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
TimerEndpoint target = (TimerEndpoint) obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "period": return target.getPeriod();
case "time": return target.getTime();
case "timer": return target.getTimer();
default: return null;
}
}
}
  1. 调用示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Test
public void test2() throws Exception {
Logger logger= LoggerFactory.getLogger(DirectTest.class);
CamelContext context=new DefaultCamelContext();
Component component=context.getComponent("timer");
Endpoint endpoint=component.createEndpoint("timer:foo?period=5s");

PropertyConfigurerGetter componentGetter= (PropertyConfigurerGetter)component.getComponentPropertyConfigurer();
PropertyConfigurerGetter endpointGetter= (PropertyConfigurerGetter)component.getEndpointPropertyConfigurer();

logger.info("component {} endpoint {}",
componentGetter.getOptionValue(component,"autowiredEnabled",false),
endpointGetter.getOptionValue(endpoint,"period",false));
component.getComponentPropertyConfigurer()
.configure(context,component,
"autowiredEnabled",false,false);
component.getEndpointPropertyConfigurer()
.configure(context,endpoint,"period","3s",false);

logger.info("component {} endpoint {}",
componentGetter.getOptionValue(component,"autowiredEnabled",false),
endpointGetter.getOptionValue(endpoint,"period",false));
}