elastic-job源码(1)- job自动装配
2023-04-26 19:37:38来源:博客园
(资料图片)
版本:3.1.0-SNAPSHOTgit地址:https://github.com/apache/shardingsphere-elasticjobMaven 坐标Spring.factories配置org.apache.shardingsphere.elasticjob elasticjob-lite-spring-boot-starter ${latest.version}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.apache.shardingsphere.elasticjob.lite.spring.boot.job.ElasticJobLiteAutoConfiguration在添加elasticjob-lite-spring-boot-starter启动类的时候,会自动加载ElasticJobLiteAutoConfiguration,接下来看下ElasticJobLiteAutoConfiguration中所做的处理。ElasticJobLiteAutoConfiguration.java
/** * ElasticJob-Lite auto configuration. */@Configuration(proxyBeanMethods = false)@AutoConfigureAfter(DataSourceAutoConfiguration.class)/** * elastic job 开关 * elasticjob.enabled.ture默认为true */@ConditionalOnProperty(name = "elasticjob.enabled", havingValue = "true", matchIfMissing = true)/** * 导入 * ElasticJobRegistryCenterConfiguration.class 注册中心配置 * ElasticJobTracingConfiguration.class job事件追踪配置 * ElasticJobSnapshotServiceConfiguration.class 快照配置 */@Import({ElasticJobRegistryCenterConfiguration.class, ElasticJobTracingConfiguration.class, ElasticJobSnapshotServiceConfiguration.class})/** * job相关配置信息 */@EnableConfigurationProperties(ElasticJobProperties.class)public class ElasticJobLiteAutoConfiguration { @Configuration(proxyBeanMethods = false) /** * ElasticJobBootstrapConfiguration.class 创建job beans 注入spring容器 * ScheduleJobBootstrapStartupRunner.class 执行类型为ScheduleJobBootstrap.class 的job开始运行 */ @Import({ElasticJobBootstrapConfiguration.class, ScheduleJobBootstrapStartupRunner.class}) protected static class ElasticJobConfiguration { }}Elastic-job 是利用zookeeper 实现分布式job的功能,所以在自动装配的时候,需要有zookeeper注册中心的配置。自动装配主要做了4件事事1.配置zookeeper 客户端信息,启动连接zookeeper.2.配置事件追踪数据库,用于保存job运行记录3.解析所有job配置文件,将所有job的bean放置在spring 单例bean中4.识别job类型,在zookeeper节点上处理job节点数据,运行定时任务job. 第一件事:配置zookeeper 客户端信息,启动连接zookeeper.ZookeeperRegistryCenter.class
public void init() { log.debug("Elastic job: zookeeper registry center init, server lists is: {}.", zkConfig.getServerLists()); CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder() //设置zookeeper 服务器地址 .connectString(zkConfig.getServerLists()) //设置重试机制 .retryPolicy(new ExponentialBackoffRetry(zkConfig.getBaseSleepTimeMilliseconds(), zkConfig.getMaxRetries(), zkConfig.getMaxSleepTimeMilliseconds())) //设置命名空间,zookeeper节点名称 .namespace(zkConfig.getNamespace()); //设置session超时时间 if (0 != zkConfig.getSessionTimeoutMilliseconds()) { builder.sessionTimeoutMs(zkConfig.getSessionTimeoutMilliseconds()); } //设置连接超时时间 if (0 != zkConfig.getConnectionTimeoutMilliseconds()) { builder.connectionTimeoutMs(zkConfig.getConnectionTimeoutMilliseconds()); } if (!Strings.isNullOrEmpty(zkConfig.getDigest())) { builder.authorization("digest", zkConfig.getDigest().getBytes(StandardCharsets.UTF_8)) .aclProvider(new ACLProvider() { @Override public ListgetDefaultAcl() { return ZooDefs.Ids.CREATOR_ALL_ACL; } @Override public List getAclForPath(final String path) { return ZooDefs.Ids.CREATOR_ALL_ACL; } }); } client = builder.build(); //zookeeper 客户端开始启动 client.start(); try { //zookeeper 客户端一直连接 if (!client.blockUntilConnected(zkConfig.getMaxSleepTimeMilliseconds() * zkConfig.getMaxRetries(), TimeUnit.MILLISECONDS)) { client.close(); throw new KeeperException.OperationTimeoutException(); } //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); }}
第二件事:配置事件追踪数据库,用于保存job运行记录
ElasticJobTracingConfiguration.java
/** * Create a bean of tracing DataSource. * * @param tracingProperties tracing Properties * @return tracing DataSource */@Bean("tracingDataSource")//spring中注入bean name 为tracingDataSource的job数据库连接信息public DataSource tracingDataSource(final TracingProperties tracingProperties) { //获取elastic-job 数据库配置 DataSourceProperties dataSource = tracingProperties.getDataSource(); if (dataSource == null) { return null; } HikariDataSource tracingDataSource = new HikariDataSource(); tracingDataSource.setJdbcUrl(dataSource.getUrl()); BeanUtils.copyProperties(dataSource, tracingDataSource); return tracingDataSource;}/** * Create a bean of tracing configuration. * * @param dataSource required by constructor * @param tracingDataSource tracing ataSource * @return a bean of tracing configuration */@Bean@ConditionalOnBean(DataSource.class)@ConditionalOnProperty(name = "elasticjob.tracing.type", havingValue = "RDB")public TracingConfigurationtracingConfiguration(final DataSource dataSource, @Nullable final DataSource tracingDataSource) { /** * dataSource 是业务数据库 * tracingDataSource 是job数据库 * 当配置elasticjob.tracing.type = RDB时,如果单独配置job数据库是,默认使用job数据库作为job运行轨迹的记录 * 但这边同时业务数据库和job追踪数据库同时注入是,mybatis-plus 结合@Table 使用的时候,很有可能找不到正确对应的数据源 */ DataSource ds = tracingDataSource; if (ds == null) { ds = dataSource; } return new TracingConfiguration<>("RDB", ds);}
通过elasticjob.tracing.type=RDB的配置开启事件追踪功能,这边job的事件追踪数据源可以和业务数据源配置不一样。
第三件事:解析所有job配置文件
ElasticJobBootstrapConfiguration.class
public void createJobBootstrapBeans() { //获取job配置 ElasticJobProperties elasticJobProperties = applicationContext.getBean(ElasticJobProperties.class); //获取单利注册对象 SingletonBeanRegistry singletonBeanRegistry = ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); //获取注入zookeeper 客户端 CoordinatorRegistryCenter registryCenter = applicationContext.getBean(CoordinatorRegistryCenter.class); //获取job事件追踪 TracingConfiguration> tracingConfig = getTracingConfiguration(); //构造JobBootstraps constructJobBootstraps(elasticJobProperties, singletonBeanRegistry, registryCenter, tracingConfig);}
重要的是constructJobBootstraps 这个方法,来看下
private void constructJobBootstraps(final ElasticJobProperties elasticJobProperties, final SingletonBeanRegistry singletonBeanRegistry, final CoordinatorRegistryCenter registryCenter, final TracingConfiguration> tracingConfig) { //遍历配置的每一个job for (Map.EntryJob 有两种类型的注入,第一种是是class,配置成job的全路径信息注入 再来看看registerClassedJob 方法里的内容entry : elasticJobProperties.getJobs().entrySet()) { ElasticJobConfigurationProperties jobConfigurationProperties = entry.getValue(); //校验 job class 和 type 都为空抛异常 Preconditions.checkArgument(null != jobConfigurationProperties.getElasticJobClass() || !Strings.isNullOrEmpty(jobConfigurationProperties.getElasticJobType()), "Please specific [elasticJobClass] or [elasticJobType] under job configuration."); //校验 job class 和 type 都有 报相互排斥 Preconditions.checkArgument(null == jobConfigurationProperties.getElasticJobClass() || Strings.isNullOrEmpty(jobConfigurationProperties.getElasticJobType()), "[elasticJobClass] and [elasticJobType] are mutually exclusive."); if (null != jobConfigurationProperties.getElasticJobClass()) { //通过class 注入job registerClassedJob(entry.getKey(), entry.getValue().getJobBootstrapBeanName(), singletonBeanRegistry, registryCenter, tracingConfig, jobConfigurationProperties); } else if (!Strings.isNullOrEmpty(jobConfigurationProperties.getElasticJobType())) { //通过type 注入job registerTypedJob(entry.getKey(), entry.getValue().getJobBootstrapBeanName(), singletonBeanRegistry, registryCenter, tracingConfig, jobConfigurationProperties); } }}
private void registerClassedJob(final String jobName, final String jobBootstrapBeanName, final SingletonBeanRegistry singletonBeanRegistry, final CoordinatorRegistryCenter registryCenter, final TracingConfiguration> tracingConfig, final ElasticJobConfigurationProperties jobConfigurationProperties) { //获取job配置 JobConfiguration jobConfig = jobConfigurationProperties.toJobConfiguration(jobName); //配置job事件追踪 jobExtraConfigurations(jobConfig, tracingConfig); //获取job类型 ElasticJob elasticJob = applicationContext.getBean(jobConfigurationProperties.getElasticJobClass()); //没有配置cron表达式 就初始化为OneOffJobBootstrap对象,一次性任务 if (Strings.isNullOrEmpty(jobConfig.getCron())) { Preconditions.checkArgument(!Strings.isNullOrEmpty(jobBootstrapBeanName), "The property [jobBootstrapBeanName] is required for One-off job."); singletonBeanRegistry.registerSingleton(jobBootstrapBeanName, new OneOffJobBootstrap(registryCenter, elasticJob, jobConfig)); } else { //有配置cron表达式 就初始化为ScheduleJobBootstrap对象,定时任务 //设置bean name String beanName = !Strings.isNullOrEmpty(jobBootstrapBeanName) ? jobBootstrapBeanName : jobConfig.getJobName() + "ScheduleJobBootstrap"; //注入ScheduleJobBootstrap对象为单利对象 singletonBeanRegistry.registerSingleton(beanName, new ScheduleJobBootstrap(registryCenter, elasticJob, jobConfig)); }}Class 类型注入的job有两种类型1.ScheduleJobBootstrap:定时任务类型的job。2.OneOffJobBootstrap:一定次job类型。 看下定义的newScheduleJobBootstrap 方法
public JobScheduler(final CoordinatorRegistryCenter regCenter, final ElasticJob elasticJob, final JobConfiguration jobConfig) { Preconditions.checkArgument(null != elasticJob, "Elastic job cannot be null."); this.regCenter = regCenter; //获取job监听器 CollectionjobListeners = getElasticJobListeners(jobConfig); // 集成所有操作zookeeper 节点的services,job 监听器 setUpFacade = new SetUpFacade(regCenter, jobConfig.getJobName(), jobListeners); //获取当前job名称 String jobClassName = JobClassNameProviderFactory.getProvider().getJobClassName(elasticJob); //zookeeper节点 {namespace}/{jobclassname}/config 放置job配置信息 this.jobConfig = setUpFacade.setUpJobConfiguration(jobClassName, jobConfig); // 集成所有操作zookeeper 节点的services schedulerFacade = new SchedulerFacade(regCenter, jobConfig.getJobName()); jobFacade = new LiteJobFacade(regCenter, jobConfig.getJobName(), jobListeners, findTracingConfiguration().orElse(null)); //检验job配置 validateJobProperties(); //定义job执行器 jobExecutor = new ElasticJobExecutor(elasticJob, this.jobConfig, jobFacade); //监听器里注入GuaranteeService setGuaranteeServiceForElasticJobListeners(regCenter, jobListeners); //创建定时任务,开始执行 jobScheduleController = createJobScheduleController();}
看下createJobScheduleController
private JobScheduleController createJobScheduleController() { JobScheduleController result = new JobScheduleController(createScheduler(), createJobDetail(), getJobConfig().getJobName()); //注册job JobRegistry.getInstance().registerJob(getJobConfig().getJobName(), result); //注册器开始运行 registerStartUpInfo(); return result;}
看下registerStartUpInfo方法
public void registerStartUpInfo(final boolean enabled) { //开始所有的监听器 listenerManager.startAllListeners(); //选举leader /{namespace}/leader/election/instance 放置选举出来的服务器 leaderService.electLeader(); //{namespace}/{ipservers} 设置enable处理 serverService.persistOnline(enabled); //临时节点 /{namespave}/instances 放置运行服务实例信息 instanceService.persistOnline(); //开启一个异步服务 if (!reconcileService.isRunning()) { reconcileService.startAsync(); }}这里实行的操作:1.开启所有监听器处理2.leader选举3.持久化节点数据4.开启异步服务 第四步:4.识别job类型,在zookeeper节点上处理job节点数据,运行定时任务job.
@Overridepublic void run(final String... args) { log.info("Starting ElasticJob Bootstrap."); applicationContext.getBeansOfType(ScheduleJobBootstrap.class).values().forEach(ScheduleJobBootstrap::schedule); log.info("ElasticJob Bootstrap started.");}获取到所有的定时任务job(ScheduleJobBootstrap类型),执行schedule方法,底层实际使用quartz框架运行定时任务。
关键词:
责任编辑:hnmd004
-
显卡风扇不转了影响大吗?显卡风扇转好还是不转好?
显卡风扇不转了影响大吗?1、风扇转动主要是使显卡散热,如果在显卡工作是达到一定的温度,风扇会自动转起,控制显卡温度,保护显卡。当低于这一
2023-07-07 15:57:38 -
word文件损坏打不开怎么修复?word文件损坏乱码怎么修复?
word文件损坏打不开怎么修复?1 打开Microsoft Word软件,点击文件菜单,选择打开命令。2 找到损坏的Word文件,选中文件后点击打开按钮
2023-07-07 10:51:03 -
0xc0000005错误代码怎么解决?应用程序0xc0000005是什么错误?
0xc0000005错误代码怎么解决?1、首先按下win+r打开运行,输入regedit按下回车。2、随后依次定位到:HKEY_LOCAL_MACHINE SOFTWARE Microsoft
2023-07-07 10:47:09 -
java环境变量配置后不生效什么原因?怎样看java环境变量是否配置成功?
java环境变量配置后不生效什么原因?1 检查系统是否支持java,即查看java的版本。如果没有安装,需要安装java环境。2 检查配置文件是否正确
2023-07-07 10:43:40 -
ios17什么时候可以更新正式版?ios17什么时候正式推送更新?
ios17什么时候可以更新正式版?ios17正式版预计9月可以更新使用,届时和iPhone15系列新机一起到来。目前,ios17 Beta版在WWDC23发布会结束后
2023-07-07 10:40:52 -
Win11打游戏FPS低怎么办?手机玩游戏帧数低怎么办?
Win11打游戏FPS低怎么办?1、进入Win11系统桌面上,点击开始选择设置进入。2、进入设置界面,点击游戏进入。3、在游戏页面,点击游戏模式进
2023-07-07 10:38:03 -
电脑开不了机怎么办按哪个键?电脑开不了机怎么强制开机?
电脑开不了机怎么办按哪个键?F8:进入 Windows 安全模式。F10:进入 BIOS 设置界面。F11:进入系统恢复界面。Del:进入 BIOS 设置界
2023-07-06 11:14:10 -
显卡风扇不转正常吗?显卡风扇不转怎么解决?
显卡风扇不转正常吗?显卡风扇不转是不正常的。1、灰尘过多可能是显卡上的灰尘太多了,导致堵塞,如果长时间不清理的话,显卡的风扇就会因为
2023-07-06 11:02:33 -
windowshello突然不能用怎么办?windows hello在哪里设置?
windowshello突然不能用怎么办?1、首先按下WIN+R,输入 services msc 回车2、在服务列表中查找 Windows Biometric Service 看这个服
2023-07-06 10:53:30 -
不支持已连接的usb设备怎么解决?无法识别的usb设备是什么意思?
不支持已连接的usb设备怎么解决?需要格式化。USB不支持已连接的设备,是因为U盘文件系统要FAT32格式,需要重新设置U盘格式,先格式化U盘,将U盘
2023-07-06 08:45:03 -
打开dwg格式的软件有哪些?dwg格式文件是什么文件?
打开dwg格式的软件有哪些?1、看图纸DwgSeePlus,一款dwg文件浏览器;2、CAD迷你看图,一款小巧的DWG文件浏览小工具;3、CAD迷你画图,一款CAD
2023-07-06 08:42:40 -
电脑突然没声音了是什么原因?电脑突然没声音了怎么解决?
电脑突然没声音了是什么原因?一起跟着小编来看看吧。电脑没有声音的原因是计算机硬件问题和软件问题,硬件问题主要是声卡坏了,或者输出声
2023-07-05 10:24:15 -
amd是哪个国家的品牌?英特尔和amd哪个厉害?
amd是哪个国家的品牌?amd处理器是美国生产的;美国AMD半导体公司专门为计算机、通信和消费电子行业设计和制造各种创新的微处理器,以及提供
2023-07-05 10:21:36 -
tmp文件可以随便删吗?tmp文件删不掉怎么办?
tmp文件可以随便删吗?是的,可以删除。 tmp文件是一种临时文件,它们通常由操作系统或应用程序创建,以存储暂时数据。一旦完成,它们就会被
2023-07-05 10:19:30 -
mkv格式手机可以看吗?苹果不支持mkv视频吗?
mkv格式手机可以看吗?可以的。 MKV并不是一种压缩格式,而是Matroska的一种媒体文件,是一种多媒体封装格式,或叫多媒体容器。 它可将多种不
2023-07-05 10:16:45 -
电脑开机慢特别卡怎么解决?电脑开机慢系统启动慢什么原因?
电脑开机慢特别卡怎么解决?好多小伙伴不知道如何解决的,那小编就把操作方法分享给大家吧,感兴趣的小伙伴可以参考看看哈。方法一: 减少
2023-07-05 10:11:39 -
zip压缩文件怎么绕过密码?已有的压缩包如何添加密码?
zip压缩文件怎么绕过密码?好多小伙伴不知道的,那小编就来给大家解答一下吧,希望可以帮助到大家吧。1、首先在电脑中,启用英文版nsis,2、
2023-07-05 10:07:06 -
文件后缀隐藏了怎么显示出来?怎么让文件显示扩展名?
文件后缀隐藏了怎么显示出来?一起来看看吧。1、首先,双击打开【计算机】,打开计算机磁盘目录,2、打开后,正常菜单栏是没有显示出来,打
2023-07-04 10:01:15 -
php文件的扩展名是什么?怎么修改php上传文件的大小?
php文件的扩展名是什么?php文件后缀名就是 php文件扩展名和标签为了让服务器来确定我们的PHP文件和脚本,我们必须保存的文件以 php结尾。怎
2023-07-04 09:56:02 -
电脑的文件恢复区在哪里找?恢复文件已损坏怎么办?
电脑的文件恢复区在哪里找?1、1 360文件恢复区打开【360安全卫士】→【木马查杀】,找到并单击左下角的【恢复区】,就可以找到360文件
2023-07-04 09:52:57 -
ipad游戏没有声音怎么回事?ipad打游戏没有声音怎么办?
ipad游戏没有声音怎么回事?1、ipad游戏没有声音可能是忘记开声音或者设置了静音,打开声音或者关闭静音。2、ipad上的游戏设置没有启用声音
2023-07-04 09:42:32 -
电脑快捷方式存在问题是什么原因?快捷方式存在问题怎么解决?
电脑快捷方式存在问题是什么原因?Win11电脑快捷方式可能会出现问题,主要是由于系统更新、病毒感染或者其他原因导致的。快捷方式存在问题怎
2023-07-04 09:34:09 -
DAT是什么文件扩展名?bmp是什么文件扩展名?
DAT是什么文件扩展名? dat文件有两种类型:1、VCD的媒体文件,是数据流格式,可以用一般的视频播放器打开,该类型文件也是MPG格式的,是VCD
2023-07-03 09:48:00 -
mp3文件格式不支持怎么办?mp3格式是什么格式?
mp3文件格式不支持怎么办?是不是好多小伙伴遇到这样的问题不知道如何解决的,那小编就把方法分享给大家吧,感兴趣的小伙伴可以参考看看哈。
2023-07-03 09:44:46 -
任务管理器被禁用怎么解除?任务管理器中没有菜单栏如何解决?
任务管理器被禁用怎么解除?好多小伙伴不知道如何解决的,那小编就把方法给大家解答一下吧,希望可以帮助到大家吧。1、开始 运行 gpedit msc
2023-07-03 09:40:26
精彩推荐
阅读排行
最新资讯
- 电脑淘宝联系不了卖家(电脑淘宝怎么联...
- 图卢兹官方:俱乐部确认将参加下赛季欧联杯
- 第一章 第八节 桑
- 新阶段!北京开放自动驾驶车内无人商业...
- 武汉发布第二批拟供地清单 涉及31宗涉宅用地
- 知乎官宣!“匿名”功能下线
- 联络互动:目前正在加快推进北京联络大...
- 特斯拉“二把手”20天套现近千万!
- 财付通回应30亿罚单:坚决服从和落实,...
- 一成首付可买房,深圳涉事楼盘紧急回应→
- 华为云盘古大模型3.0来了!它为何不做中...
- AI创新成果走进应用场:GE医疗中国发布...
- 国家要“动真格”了?催买房无效后,智...
- 平谷一工业用地顺利成交
- 平谷一物流用地顺利成交
- 从“蔚小理”到“理蔚小”:销量差距背...
- 天智航股东拟合计减持不超2%股份
- 美媒:拜登批准向乌克兰提供违禁武器集...
- 海看股份:公司拥有超过9000小时的超清...
- 中国建筑材料联合会到山东玻纤调研指导工作
- 瑞普生物:猫三联疫苗正在新药申报注册...
- 安居房、人才房成为历史?2023深圳保障...
- 科技感仪式感通通拉满的录取通知书!南...
- 协鑫集成:公司目前订单储备充裕
- 西藏昌都发放购房补贴:干部职工300元/...
- 满足哪些条件可以线上办理公积金提取?...
- 30亿!支付宝、财付通收巨额罚单!
- 福建邵武:鼓励工会组织职工团购商品住...
- 新化首例不动产登记“带押过户”业务成...
- 7月7日大公司动向追踪:蚂蚁、腾讯领百...
- “河西人才节”重磅举措 河西区发布人...
- 把长安CS35 PLUS、吉利缤越压着打,202...
- Plog|长沙这个夏天,热!热!热!热!热!
- 广汇物流:拟定增募资不超18亿元
- 招商蛇口上半年销售约1664亿元 近期新...
- 2023年小暑物企最佳官宣海报:上坤物业
- 为控股股东提供关联担保未按规履行决策...
- 北京汽车:“巅峰”对话谋发展 雪域高...
- 川投能源业绩快报:上半年净利润同比增...
- 中原按揭:新措施促进香港楼市健康发展...
- 上半年宝龙地产销售约176亿元,上坤地产...
- 最新!佛山五区地价TOP10地图出炉,禅桂...
- 新赛股份:控股股东筹划公司控制权变更...
- 中国平安董事会审议通过付欣出任公司副...
- 一周法治播报|第77期:深圳发布四个政府...
- 谁让国内顶流足球红人同台齐聚?
- 2023年矿物制品龙头股有哪些?(2023/7/7)
- 华人健康:拟3.47亿元收购江苏神华100%股份
- 公积金利息可以取出来花吗?怎么操作?
- 房价下跌13%,香港放大招了!刺激楼市,...
- 金融管理部门对蚂蚁集团及旗下机构罚款7...
- 国能日新:董事及监事等拟合计减持不超2...
- 搭载全新发动机,蒙迪欧1.5T车型能否满...
- 贵阳银行:董事会秘书董静辞职
- 深网观察 第761期 | 深圳报业食堂摆...
- 时刻半年!连江将再出让2幅地块!位置在...
- 市区这片将拆迁!补偿政策...
- 45天下线1万台,哈弗枭龙要为新能源SUV...
- 瞄准全场景智慧出行,深蓝汽车要解决行...
- 中国石油北京项目管理公司:给予胡继勇...
- 齐翔腾达:子公司青岛思远8万吨/年甲乙...
- 招商银行:王小青副行长任职资格已获得核准
- cpu带k和f和kf(cpu带k的和带kf有何区别)
- 江苏出台临时用地管理规范性文件 明确...
- 2023年重庆市养老金计发补发时间什么时候?
- 产品力再突破,锋兰达要将“高价值”传...
- 通用电气发布可持续发展报告 多途径助...
- 简阳市市场监管局靠前发力 保障大运会...
- 住建部明确城市更新底线要求 坚持“留...
- 华依科技董事拟减持不超1.5%股份
- 《北京数字经济发展报告(2022~2023)》发布
- 链家,其实遇到了重大瓶颈
- 广汇物流:拟向控股股东等定增募资不超1...
- 保利发展上半年销售2368.21亿元 6月份2...
- 4.19公顷!史各庄这个地块“规划方案”...
- 问界M5标准版亮相,赛力斯要推动智慧汽...
- AI创新院正式成立 游族网络全面推进AI...
- 知乎宣布将下线匿名功能
- 大恒科技(600288.SH):以1.74亿元出售两...
- 冰箱保鲜蔬菜是密封好还是透气好?
- 掌趣科技旗下《饥饿鲨:进化》APP存在过...
- 株洲市三个名师工作室落户八中
- 开展危旧房排查 筑牢安全大根基
- 宣亚国际:公司暂未使用高算力、高传输...
- 格力地产:三亚合联中央商务区项目正在...
- 中南建设:公司西安中南上悦城4月底已完...
- 宋城演艺:公司目前已不持有SPACES任何股权
- 泉峰汽车:收到国内某知名通信科技公司...
- 深圳福彩公益微电影《星光》获国家广电...
- 九安医疗:公司已有专门负责糖尿病诊疗...
- 克而瑞:金科引入长城国富作战投,长实...
- 丰山集团:丰山全诺在钒电池液流电解液...
- 咸宁出台新政!事关老旧小区
- 今年首批!老旧小区改造,涉及昌平两个小区
- “和平方舟”号医院船,西太平洋全流程...
- 木头毛刺用什么打磨抛光(木头毛刺用什...
- 在各地大力推动下 保障性租赁住房筹建...
- 370亿风电龙头腰斩了
- 中秋节发红包多少适合女朋友的
- 13天完成100%签约,7天完成100%搬迁,居...
-
当前报道:寻星镜怎么校准 寻星镜
下一篇2023-04-26 20:09:03
-
股票ROE是什么意思啊_股票roe是什么意思_每日速读
上一篇2023-04-26 19:09:16