96SEO 2026-02-23 11:09 14
的人按照那上面的步骤来也是可以搭建出一个可以使用的例子来所以今天就不在这里重复前人的工作直接开始就开始将这个源代码中的原理吧。

powerjob框架主要分成两个分部server和worker这两部分需要分别去启动而且需要先启动server后启动worker否则worker会因为找不到可用的server而启动失败。
作为一个server启动的时候工作自然是非常繁重的主要有以下几个步骤
https://www.yuque.com/powerjob/guidence/problem\n
{pre();//下方的私有静态方法AkkaStarter.init();//启动AkkaVertXStarter.init();//启动Vertx//启动Springtry
{SpringApplication.run(PowerJobServerApplication.class,
{log.info(TIPS);//将上方的常量字符串打印出来PropertyUtils.init();//读取配置文件
这一步特别简单仅仅涉及到server.common.utils包中的PropertyUtils。
主要代码段如下
PropertyUtils.class.getClassLoader().getResource(application.properties);Objects.requireNonNull(propertiesURL);try
PropertyUtils.class.getClassLoader().getResource(application.properties);
这个代码就是读取配置文件中的内容下面是powerjob的文件目录层次看图就知道该段代码到底读的是哪一部分。
说句实话最开始的时候我认为读取的是上面红色箭头指的地方因为他代码里getResource这个地方我认为就是读取resource文件夹下面的文件但是.getClassLoader无法解释后来自己跑一下这个代码就明白了读取的是编译完的文件路径而不是编译之前的路径。
读取的和配置文件里面的一模一样一条不多一条不少~springboot正常也会读取配置文件这里为什么要单独执行一下读取作用是什么在这里先不说看到后面遇到了再来解答留作问题1。
powerjob里面主要使用的akka-remote就是用来通信的说白了就是手机用来给彼此打电话汇报信息的。
Akka框架的介绍请移步akka的官网自己去欣赏这里只将代码的作用做一个讲解。
这个AkkaStarter是在server.remote.transport.starter包里init方法代码如下
{//一个计时的方法就不用在开始与结束的时候使用System获取时间然后再进行相减了。
Stopwatch
Stopwatch.createStarted();log.info([PowerJob]
parseConfig();//创建一个Akka的actor系统相当于建立了一个公司之后所有的actor行动都在这个公司内进行actorSystem
ActorSystem.create(RemoteConstant.SERVER_ACTOR_SYSTEM_NAME,
akkaFinalConfig);//创建了一个actor。
actorSystem.actorOf(FriendRequestHandler.defaultProps(),
RemoteConstant.SERVER_FRIEND_ACTOR_NAME);log.info([PowerJob]
{//这一步是获取了启动第一步的读取配置文件后获取的配置内容这也就回答了问题1。
Properties
PropertyUtils.getProperties();//获取配置文件中oms.akka.port字段的内容如果没有该配置则默认为10086端口int
Integer.parseInt(properties.getProperty(PowerJobServerConfigKey.AKKA_PORT,
String.valueOf(OmsConstant.SERVER_DEFAULT_AKKA_PORT)));//这个是通过jvm启动时配置oms.akka.port的参数例如启动时候的java
System.getProperty(PowerJobServerConfigKey.AKKA_PORT);//如果配置了jvm启动的配置则将其覆盖配置文件的akka端口也就是说jvm配置优先级高于配置文件的配置if
(StringUtils.isNotEmpty(portFromJvm))
Integer.parseInt(portFromJvm);}//
Maps.newHashMap();//获取本地的ip地址下面会详细进入到代码中说一下这里面还挺深的String
NetUtils.getLocalHost();//将关键字放到一个map映射中overrideConfig.put(akka.remote.artery.canonical.hostname,
localIp);overrideConfig.put(akka.remote.artery.canonical.port,
port);//ip和端口组成了akka的通信地址actorSystemAddress
actorSystemAddress);//获取oms-server.akka.conf配置文件里面的配置ConfigFactory为akka自带方法Config
ConfigFactory.load(RemoteConstant.SERVER_AKKA_CONFIG_NAME);//overrideConfig里面有的配置内容按照overrideConfig走没有的按照配置文件akkaBasicConfig走return
ConfigFactory.parseMap(overrideConfig).withFallback(akkaBasicConfig);
在解析配置文件中其实真正有点内容的就是这个获取本地地址这个方法之前我没有去细研究之前可把我给坑毁了因为我想用局域网的ip进行来回通信但是因为这个获取地址里面的默认策略导致每一次使用的都不是我想用的IP地址当我研究完了这个代码之后终于是柳暗花明又一村了直接就可以指定地址了。
//这个代码就是在获取了地址之后就直接将地址存起来下一次再用就可以直接返回了if
HOST_ADDRESS;}//获取jvm启动时设置的powerjob.network.local.address关键字的地址通过这个就可以直接绑定ip了String
System.getProperty(PowerJobDKey.BIND_LOCAL_ADDRESS);if
(StringUtils.isNotEmpty(addressFromJVM))
PowerJobDKey.BIND_LOCAL_ADDRESS,
addressFromJVM;}//如果上一步没有绑定地址那就在通过getLocalAddress来获取地址。
InetAddress
address.getHostAddress();}return
大概知道了获取host的思路下一篇文章我们再详细介绍里面的具体流程因为里面的流程相对来说有那么一点点的不简单在这里讲的话会稍显冗长所以我准备另开一篇详细说一下。
ActorSystem.create(RemoteConstant.SERVER_ACTOR_SYSTEM_NAME,
actorSystem.actorOf(FriendRequestHandler.defaultProps(),
RemoteConstant.SERVER_FRIEND_ACTOR_NAME);
第一个就是建立actor系统参数一个是系统的名字类似于电话号码后四位那么一个东西另一个是akka的配置这个在解析配置文件步骤中获取。
第二个是创建actor这里创建的是FriendRequestHandler的Actor调用其defaultProps()方法源代码如下
Props.create(FriendRequestHandler.class)//这一步是设置派发器的配置。
//读取配置文件oms-server.akka.conf中akka.friend-request-actor-dispatcher的关键字.withDispatcher(akka.friend-request-actor-dispatcher)//路由配置.withRouter(new
RoundRobinPool(Runtime.getRuntime().availableProcessors()
DefaultResizer(Runtime.getRuntime().availableProcessors()
4,Runtime.getRuntime().availableProcessors()
最后的vertx的启动基本没什么东西就是vertx的默认启动一行代码就OK了其余的内容和akka启动时基本相同。
Server的启动相对来说没有那么的复杂代码读起来也是非常的通俗易懂这里面只出现了一个问题
springboot自带读配置文件的功能为什么启动的时候要先读取配置文件
因为启动akka和vertx的时候需要配置文件的内容而这个时候spring还没有读取该配置文件。
https://blog.csdn.net/i_mycode/article/details/108382597
【getClassLoader().getResource()
http://doc.yonyoucloud.com/doc/akka-doc-cn/2.3.6/scala/book/chapter1/01_what_is_akka.html
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback