您现在的位置是:主页 > news > 网站后台管理系统如何使用/seo整站优化解决方案
网站后台管理系统如何使用/seo整站优化解决方案
admin2025/5/24 23:34:45【news】
简介网站后台管理系统如何使用,seo整站优化解决方案,做一个交友网站怎样做需要多少资金,网站产品链接怎么做的通过自定义Exchange Id的格式,我们可以快速缩小问题的范围,定位到我们感兴趣的位置。 1. 概述 使用Apache Camel时,我们经常会有自定义Exchange Id的需求,这样我们可以一眼看出当前Route的意图,方便理解和快速缩小问题…
通过自定义Exchange Id的格式,我们可以快速缩小问题的范围,定位到我们感兴趣的位置。
1. 概述
使用Apache Camel时,我们经常会有自定义Exchange Id的需求,这样我们可以一眼看出当前Route的意图,方便理解和快速缩小问题的规模,抓住感兴趣的点。
2. 默认实现
Apache Camel使用内部定义的UuidGenerator
来完成生成ExchangeId的功能,UuidGenerator
默认有三种实现方式,而Camel一般情况下是使用ActiveMQUuidGenerator
(源码参见DefaultCamelContext
类中的私有方法createDefaultUuidGenerator()
)。
针对ActiveMQUuidGenerator
类中,其对于UuidGenerator
的实现采用的是 seed + 全局顺序号的方式,其中seed的生成规则如下:
"ID-" + {{hostname}} + "-" + {{activeMQ localPort}} + "-" + {{System.currentTimeMillis()}} + "-";+ {{instanceCount}} + "-"
。
- 其中以 {{ }} 表示引用,比如 {{hostname}} 代表本机的计算机名称
- {{activeMQ localPort}} : activeMQ的本地端口
- {{System.currentTimeMillis()}} : ActiveMQUuidGenerator类加载进JVM的时机
- {{instanceCount}} :其中instanceCount为ActiveMQUuidGenerator中的一个静态私有字段,其代表UuidGenerator 的数量,也就是CamelContext的数量。
对于全局顺序号的生成,Camel使用AtomicLong类来辅助完成:{{sequence.getAndIncrement()}}
。
因此最终,默认情况下我们得到的ExchangeId,形如ID-fulizhe-2904-1555987323576-0-4
。感兴趣的读者可以对比该ExchangeId实例和上述规则来加深理解。
2.1 新版实现DefaultUuidGenerator
出于优化启动速度,以及避免ActiveMQ本地端口的随机性问题的目的, 在Camel的最新版本中,添加了一个新的UuidGenerator
实现类DefaultUuidGenerator
,其生成的ExchangeId规则形如ID-{{hostname}}-{{System.currentTimeMillis()}}-{{instanceCount}}-{{sequence.getAndIncrement()}}
,相应的实例如ID-fulizhe-1555990155830-0-1
。
注意本类中也提供了一个静态方法generateSanitizedId()
,用以确保生成的ExchangeId对URL和文件系统友好。
3. 自定义实现
参考Camel内部实现,如果需要自定义ExchangeId,最直接的方法当然就是实现UuidGenerator
接口并提供自己的生成规则,当然为了简化我们的操作,我们可以从现有的Camel实现类中选择一个作为基类,以复用逻辑。
public class CustomUuidGenerator extends DefaultUuidGenerator {@Overridepublic String generateUuid() {final String rawUUID = super.generateUuid();return StringUtil.format("{}-{}", rawUUID, "夫礼者");}
}
相应的单元测试如下:
Main main = new Main();
main.addRouteBuilder(new RouteBuilder() {public void configure() throws Exception {// 替换为自定义的UuidGenerator实现类this.getContext().setUuidGenerator(new CustomUuidGenerator());this.getContext().setTracing(true);from("stream:in?promptMessage=Enter something:")// .to("stream:out");}
});
main.start();
Thread.sleep(10*1000);
main.stop();
3.1 运行时生成ExchangeId
以上自定义实现虽然有了一定的扩展空间,但限于UuidGenerator
的定义,我们无法达到在运行时候动态格式化ExchangeId的目的,以下给出两种实现,各有利弊,有需要的读者自行选择:
-
借助于
Processor
接口
因为Exchange接口自身是提供了setExchangeId()
方法的,鉴于此,我们可以选择向Route开端插入一个自定义的Processor来完成本项需求:from("stream:in?promptMessage=Enter something:")//.tracing()//.process(new Processor() {@Overridepublic void process(Exchange exchange) throws Exception {exchange.setExchangeId(exchange.getExchangeId() + "夫礼者"+ RandomUtil.randomInt());}})// .to("stream:out");
这种实现方式明显存在一定缺陷,就是在整个Route中,processor执行前后的ExchangeId发生了改变。
-
第二种方式就是比较正规的了,可以通过自定义Component来为生成的
DefaultExchange
实例设置ID,进行达到动态设置的目的,注意DefaultExchange
被final修饰,而且本需求也并不需要自己去实现Exchange
接口。