您现在的位置是:主页 > news > 网站后台管理系统如何使用/seo整站优化解决方案

网站后台管理系统如何使用/seo整站优化解决方案

admin2025/5/24 23:34:45news

简介网站后台管理系统如何使用,seo整站优化解决方案,做一个交友网站怎样做需要多少资金,网站产品链接怎么做的通过自定义Exchange Id的格式,我们可以快速缩小问题的范围,定位到我们感兴趣的位置。 1. 概述 使用Apache Camel时,我们经常会有自定义Exchange Id的需求,这样我们可以一眼看出当前Route的意图,方便理解和快速缩小问题…

网站后台管理系统如何使用,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())。
UuidGenerator继承链

针对ActiveMQUuidGenerator类中,其对于UuidGenerator的实现采用的是 seed + 全局顺序号的方式,其中seed的生成规则如下:
"ID-" + {{hostname}} + "-" + {{activeMQ localPort}} + "-" + {{System.currentTimeMillis()}} + "-";+ {{instanceCount}} + "-"

  1. 其中以 {{ }} 表示引用,比如 {{hostname}} 代表本机的计算机名称
  2. {{activeMQ localPort}} : activeMQ的本地端口
  3. {{System.currentTimeMillis()}} : ActiveMQUuidGenerator类加载进JVM的时机
  4. {{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的目的,以下给出两种实现,各有利弊,有需要的读者自行选择:

  1. 借助于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发生了改变。

  2. 第二种方式就是比较正规的了,可以通过自定义Component来为生成的DefaultExchange实例设置ID,进行达到动态设置的目的,注意DefaultExchange被final修饰,而且本需求也并不需要自己去实现Exchange接口。