保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

SpringBoot官方支持任务调度框架,轻量级用起来也挺香

  定时任务的应用场景其实蛮常见的,比如说:数据备份订单未支付则自动取消定时爬取数据定时推送信息定时发布文章等等(想不出来了,只能等等来凑,,反正只要等的都需要定时,怎么样,这波圆场可以吧)
  编程喵实战项目里需要做一个定时发布文章的功能,一开始我想用SpringTask,于是研究了一番,发现SpringTask用起来确实简单,但对于复杂业务却也无能为力。
  于是我就把注意力放到了Quartz上面,这是一款老而弥坚的开源任务调度框架。
  记得我在14年开发大宗期货交易平台的时候就用到了它,每天凌晨定时需要统计一波交易数据,生成日报报表,当时配合Cron表达式用的。
  可惜后来平台稳定了,新的政策出来了,直接把大宗期货交易灭了。于是我发财的机会也随着破灭了。想想都觉得可惜,哈哈哈。
  时光荏苒,Quartz发展到现在,已经可以和SpringBoot项目无缝衔接了,今天我们就来实战一把。Timer
  JDK1。3就开始支持的一种定时任务的实现方式。内部通过TaskQueue的类来存放定时任务,用起来比较简单,但缺陷比较多,比如说一个Timer就会起一个线程,任务多了性能就非常差,再比如说如果执行任务期间某个TimerTask耗时比较久,就会影响其他任务的调度。Slf4jpublicclassTimerDemo{publicstaticvoidmain(String〔〕args){TimerTasktasknewTimerTask(){Overridepublicvoidrun(){log。debug(当前时间{}线程名称{},DateTime。now(),Thread。currentThread()。getName());}};log。debug(当前时间{}线程名称{},DateTime。now(),Thread。currentThread()。getName());TimertimernewTimer(TimerDemo);timer。schedule(task,1000L);}}
  代码跑起来后的日志如下所示:13:11:45。268〔main〕DEBUGtop。springtask。TimerDemo当前时间2022042713:11:45线程名称main13:11:46。280〔TimerDemo〕DEBUGtop。springtask。TimerDemo当前时间2022042713:11:46线程名称TimerDemoScheduledThreadPoolExecutor
  JDK1。5开始提供的的定时任务,它继承了ThreadPoolExecutor,实现了ScheduledExecutorService接口,所以支持并发场景下的任务执行。同时,优化了Timer的缺陷。不过,由于使用了队列来实现定时器,就有出入队列、调整堆等操作,所以定时不是非常非常准确(吹毛求疵)。Slf4jpublicclassScheduledThreadPoolExecutorDemo{publicstaticvoidmain(String〔〕args)throwsInterruptedException{TimerTasktasknewTimerTask(){Overridepublicvoidrun(){log。debug(当前时间{}线程名称{},DateTime。now(),Thread。currentThread()。getName());}};log。debug(当前时间{}线程名称{},DateTime。now(),Thread。currentThread()。getName());ScheduledExecutorServiceexecutorServiceExecutors。newScheduledThreadPool(3);executorService。scheduleAtFixedRate(task,1000L,1000L,TimeUnit。MILLISECONDS);Thread。sleep(100010004);executorService。shutdown();}}
  输出结果如下所示:14:43:41。740〔main〕DEBUGtop。springtask。ScheduledThreadPoolExecutorDemo当前时间2022042714:43:41线程名称main14:43:42。752〔pool1thread1〕DEBUGtop。springtask。ScheduledThreadPoolExecutorDemo当前时间2022042714:43:42线程名称pool1thread114:43:43。748〔pool1thread1〕DEBUGtop。springtask。ScheduledThreadPoolExecutorDemo当前时间2022042714:43:43线程名称pool1thread114:43:44。749〔pool1thread2〕DEBUGtop。springtask。ScheduledThreadPoolExecutorDemo当前时间2022042714:43:44线程名称pool1thread214:43:45。749〔pool1thread2〕DEBUGtop。springtask。ScheduledThreadPoolExecutorDemo当前时间2022042714:43:45线程名称pool1thread214:43:46。749〔pool1thread2〕DEBUGtop。springtask。ScheduledThreadPoolExecutorDemo当前时间2022042714:43:46线程名称pool1thread2SpringTask
  SpringTask是Spring提供的轻量级定时任务工具,也就意味着不需要再添加第三方依赖了,相比其他第三方类库更加方便易用。
  好像关于SpringTask,没有其他废话可说了,我们来直接上手。
  第一步,新建配置类SpringTaskConfig,并添加EnableScheduling注解开启SpringTask。ConfigurationEnableSchedulingpublicclassSpringTaskConfig{}
  当然了,也可以不新建这个配置类,直接在主类上添加EnableScheduling注解。SpringBootApplicationEnableSchedulingpublicclassCodingmoreSpringtaskApplication{publicstaticvoidmain(String〔〕args){SpringApplication。run(CodingmoreSpringtaskApplication。class,args);}}
  第二步,新建定时任务类CronTask,使用Scheduled注解注册Cron表达式执行定时任务。Slf4jComponentpublicclassCronTask{Scheduled(cron01??)publicvoidcron(){log。info(定时执行,时间{},DateUtil。now());}}
  启动服务器端,发现每隔一秒钟会打印一次日志,证明SpringTask的cron表达式形式已经起效了。
  默认情况下,Scheduled创建的线程池大小为1,如果想增加线程池大小的话,可以让SpringTaskConfig类实现SchedulingConfigurer接口,通过setPoolSize增加线程池大小。ConfigurationEnableSchedulingpublicclassSpringTaskConfigimplementsSchedulingConfigurer{OverridepublicvoidconfigureTasks(ScheduledTaskRegistrartaskRegistrar){ThreadPoolTaskSchedulerthreadPoolTaskSchedulernewThreadPoolTaskScheduler();threadPoolTaskScheduler。setPoolSize(10);threadPoolTaskScheduler。setThreadNamePrefix(myscheduledtaskpool);threadPoolTaskScheduler。initialize();taskRegistrar。setTaskScheduler(threadPoolTaskScheduler);}}
  服务热部署完成后,会在控制台看到这样的信息:
  可以确认自定义线程池大小已经生效了,有的任务用的是线程ledtaskpool3,有的是线程ledtaskpool7,跑时间长了,可以发现ledtaskpool1到ledtaskpool10的都有。
  SpringTask除了支持Cron表达式,还有fixedRate(固定速率执行)、fixedDelay(固定延迟执行)、initialDelay(初始延迟)三种用法。fixedRate:固定速率执行。每5秒执行一次。Scheduled(fixedRate5000)publicvoidreportCurrentTimeWithFixedRate(){log。info(CurrentThread:{},Thread。currentThread()。getName());log。info(FixedRateTask:Thetimeisnow{},DateUtil。now());}fixedDelay:固定延迟执行。距离上一次调用成功后2秒才执。Scheduled(fixedDelay2000)publicvoidreportCurrentTimeWithFixedDelay(){try{TimeUnit。SECONDS。sleep(3);log。info(FixedDelayTask:Thetimeisnow{},DateUtil。now());}catch(InterruptedExceptione){e。printStackTrace();}}initialDelay:初始延迟。任务的第一次执行将延迟5秒,然后将以5秒的固定间隔执行。Scheduled(initialDelay5000,fixedRate5000)publicvoidreportCurrentTimeWithInitialDelay(){log。info(FixedRateTaskwithInitialDelay:Thetimeisnow{},DateUtil。now());}
  不过,fixedRate有个坑,假如某个方法的定时器设定的固定速率是每5秒执行一次,这个方法现在要执行下面四个任务,四个任务的耗时是:6s、6s、2s、3s,任务会如何执行呢(单线程环境下)?2022042715:25:52。400INFO4343〔ledtaskpool1〕c。codingmore。component。PublishPostTask:FixedRateTask:Thetimeisnow2022042715:25:522022042715:25:58。401INFO4343〔ledtaskpool1〕c。codingmore。component。PublishPostTask:FixedRateTask:Thetimeisnow2022042715:25:582022042715:26:00。407INFO4343〔ledtaskpool1〕c。codingmore。component。PublishPostTask:FixedRateTask:Thetimeisnow2022042715:26:002022042715:26:04。318INFO4343〔ledtaskpool1〕c。codingmore。component。PublishPostTask:FixedRateTask:Thetimeisnow2022042715:26:04
  第一个任务开始的相对时间是第0秒,但由于执行了6秒,所以原来应该是第5秒执行的任务,延迟到第6秒才开始执行,第三个任务延迟了12秒,原本应该是第10秒执行,第三个任务没有延迟,正常15秒后执行。
  假如我们使用EnableAsync注解开启多线程环境的话,结果会怎么样呢?2022042715:33:01。385INFO4421〔ledtaskpool1〕c。codingmore。component。PublishPostTask:FixedRateTask:Thetimeisnow2022042715:33:012022042715:33:07。390INFO4421〔ledtaskpool1〕c。codingmore。component。PublishPostTask:FixedRateTask:Thetimeisnow2022042715:33:072022042715:33:09。391INFO4421〔ledtaskpool1〕c。codingmore。component。PublishPostTask:FixedRateTask:Thetimeisnow2022042715:33:092022042715:33:13。295INFO4421〔ledtaskpool1〕c。codingmore。component。PublishPostTask:FixedRateTask:Thetimeisnow2022042715:33:13关于Cron表达式
  这里顺带普及一下Cron表达式,在定时任务中会经常会遇到。Cron这个词来源于希腊语chronos,原意也就是时间。
  Cron表达式是一个含有时间意义的字符串,以5个空格隔开,分成6个时间元素。举几个例子就一目了然了。
  示例
  说明
  01510?
  每天上午10:15执行任务
  0010,14,16?
  每天10点、14点、16点执行任务
  0012?3
  每个星期三中午12点执行任务
  0151015?
  每月15日上午10点15执行任务
  Cron的语法格式可以总结为:
  SecondsMinutesHoursDayofMonthMonthDayofWeek
  每个时间元素的取值范围,以及可出现的特殊字符如下所示。
  时间元素
  取值范围
  可出现的特殊字符
  秒
  〔0,59〕
  ,
  分钟
  〔0,59〕
  ,
  小时
  〔0,59〕
  ,
  日期
  〔0,31〕
  ,?LW
  月份
  〔1,12〕
  ,
  星期
  〔1,7〕
  ,?L
  特殊字符的含义和示例如下所示。
  特殊字符
  含义
  示例
  所有可能的值
  很好理解,月域中为每个月,星期域中每个星期几
  ,
  枚举的值
  很好理解,小时域中10,14,16,就表示这几个小时可选
  范围
  很好理解,分钟域中1019,就表示1019分钟每隔一分钟执行一次
  指定数值的增量
  很好理解,分钟域中015,就表示每隔15分钟执行一次
  ?
  不指定值
  很好理解,日期域指定了星期域就不能指定值,反之亦然,因为日期域和星期域属于冲突关系
  L
  单词Last的首字母
  很好理解,日期域和星期域支持,表示月的最后一天或者星期的最后一天
  W
  除周末以外的工作日
  很好理解,仅日期域支持
  每个月的第几个星期几
  很好理解,仅星期域支持,42表示某月的第二个星期四关于Quartz
  Quartz是一款功能强大的开源的任务调度框架,在GitHub上已经累计有5k的star了。小到单机应用,大到分布式,都可以整合Quartz。
  在使用Quartz之前,让我们先来搞清楚4个核心概念:Job:任务,要执行的具体内容。JobDetail:任务详情,Job是它要执行的内容,同时包含了这个任务调度的策略和方案。Trigger:触发器,可以通过Cron表达式来指定任务执行的时间。Scheduler:调度器,可以注册多个JobDetail和Trigger,用来调度、暂停和删除任务。整合Quartz
  Quartz存储任务的方式有两种,一种是使用内存,另外一种是使用数据库。内存在程序重启后就丢失了,所以我们这次使用数据库的方式来进行任务的持久化。
  第一步,在pom。xml文件中添加Quartz的starter。dependencygroupIdorg。springframework。bootgroupIdspringbootstarterquartzartifactIdversion2。6。7versiondependency
  第二步,在application。yml添加Quartz相关配置,配置说明直接看注释。spring:quartz:jobstoretype:jdbc默认为内存memory的方式,这里我们使用数据库的形式waitforjobstocompleteonshutdown:true关闭时等待任务完成overwriteexistingjobs:true可以覆盖已有的任务jdbc:initializeschema:never是否自动使用SQL初始化Quartz表结构properties:quartz原生配置org:quartz:scheduler:instanceName:scheduler调度器实例名称instanceId:AUTO调度器实例ID自动生成JobStore相关配置jobStore:class:org。quartz。impl。jdbcjobstore。JobStoreTXJobStore实现类driverDelegateClass:org。quartz。impl。jdbcjobstore。StdJDBCDelegate使用完全兼容JDBC的驱动tablePrefix:QRTZQuartz表前缀useProperties:false是否将JobDataMap中的属性转为字符串存储线程池相关配置threadPool:threadCount:25线程池大小。默认为10。threadPriority:5线程优先级class:org。quartz。simpl。SimpleThreadPool指定线程池实现类,对调度器提供固定大小的线程池
  Quartz默认使用的是内存的方式来存储任务,为了持久化,我们这里改为JDBC的形式,并且指定spring。quartz。jdbc。initializeschemanever,这样我们可以手动创建数据表。因为该值的另外两个选项ALWAYS和EMBEDDED都不太符合我们的要求:ALWAYS:每次都初始化EMBEDDED:只初始化嵌入式数据库,比如说H2、HSQL
  那手动创建数据表的SQL语句去哪里找呢?
  GitHub地址:https:github。comquartzschedulerquartztreemasterquartzcoresrcmainresourcesorgquartzimpljdbcjobstore
  为了方便小伙伴们下载,我把它放在了本教程的源码里面了:
  如果使用IntellijIDEA旗舰版的话,首次打开SQL文件的时候会提示你指定数据源。在上图中,我配置了本地的MySQL数据库,导入成功后可以在数据库中查看到以下数据表:
  Quartz数据库核心表如下:
  TableName
  Description
  QRTZCALENDARS
  存储Quartz的Calendar信息
  QRTZCRONTRIGGERS
  存储CronTrigger,包括Cron表达式和时区信息
  QRTZFIREDTRIGGERS
  存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息
  QRTZPAUSEDTRIGGERGRPS
  存储已暂停的Trigger组的信息
  QRTZSCHEDULERSTATE
  存储少量的有关Scheduler的状态信息,和别的Scheduler实例
  QRTZLOCKS
  存储程序的悲观锁的信息
  QRTZJOBDETAILS
  存储每一个已配置的Job的详细信息
  QRTZJOBLISTENERS
  存储有关已配置的JobListener的信息
  QRTZSIMPLETRIGGERS
  存储简单的Trigger,包括重复次数、间隔、以及已触的次数
  QRTZBLOGTRIGGERS
  Trigger作为Blob类型存储
  QRTZTRIGGERLISTENERS
  存储已配置的TriggerListener的信息
  QRTZTRIGGERS
  存储已配置的Trigger的信息
  剩下的就是对Quartz的scheduler、jobStore和threadPool配置。
  第三步,创建任务调度的接口IScheduleService,定义三个方法,分别是通过Cron表达式来调度任务、指定时间来调度任务,以及取消任务。publicinterfaceIScheduleService{通过Cron表达式来调度任务StringscheduleJob(Classlt;?extendsJobjobBeanClass,Stringcron,Stringdata);指定时间来调度任务StringscheduleFixTimeJob(Classlt;?extendsJobjobBeanClass,DatestartTime,Stringdata);取消定时任务BooleancancelScheduleJob(StringjobName);}
  第四步,创建任务调度业务实现类ScheduleServiceImpl,通过Scheduler、CronTrigger、JobDetail的API来实现对应的方法。Slf4jServicepublicclassScheduleServiceImplimplementsIScheduleService{privateStringdefaultGroupdefaultgroup;AutowiredprivateSchedulerscheduler;OverridepublicStringscheduleJob(Classlt;?extendsJobjobBeanClass,Stringcron,Stringdata){StringjobNameUUID。fastUUID()。toString();JobDetailjobDetailJobBuilder。newJob(jobBeanClass)。withIdentity(jobName,defaultGroup)。usingJobData(data,data)。build();创建触发器,指定任务执行时间CronTriggercronTriggerTriggerBuilder。newTrigger()。withIdentity(jobName,defaultGroup)。withSchedule(CronScheduleBuilder。cronSchedule(cron))。build();调度器进行任务调度try{scheduler。scheduleJob(jobDetail,cronTrigger);}catch(SchedulerExceptione){log。error(任务调度执行失败{},e。getMessage());}returnjobName;}OverridepublicStringscheduleFixTimeJob(Classlt;?extendsJobjobBeanClass,DatestartTime,Stringdata){日期转CRON表达式StringstartCronString。format(ddddd?d,DateUtil。second(startTime),DateUtil。minute(startTime),DateUtil。hour(startTime,true),DateUtil。dayOfMonth(startTime),DateUtil。month(startTime)1,DateUtil。year(startTime));returnscheduleJob(jobBeanClass,startCron,data);}OverridepublicBooleancancelScheduleJob(StringjobName){booleansuccessfalse;try{暂停触发器scheduler。pauseTrigger(newTriggerKey(jobName,defaultGroup));移除触发器中的任务scheduler。unscheduleJob(newTriggerKey(jobName,defaultGroup));删除任务scheduler。deleteJob(newJobKey(jobName,defaultGroup));successtrue;}catch(SchedulerExceptione){log。error(任务取消失败{},e。getMessage());}returnsuccess;}}
  第五步,定义好要执行的任务,继承QuartzJobBean类,实现
  executeInternal方法,这里只定义一个定时发布文章的任务。Slf4jComponentpublicclassPublishPostJobextendsQuartzJobBean{AutowiredprivateIScheduleServicescheduleService;AutowiredprivateIPostsServicepostsService;OverrideprotectedvoidexecuteInternal(JobExecutionContextjobExecutionContext)throwsJobExecutionException{TriggertriggerjobExecutionContext。getTrigger();JobDetailjobDetailjobExecutionContext。getJobDetail();JobDataMapjobDataMapjobDetail。getJobDataMap();LongdatajobDataMap。getLong(data);log。debug(定时发布文章操作:{},data);获取文章的ID后获取文章,更新文章为发布的状态,还有发布的时间booleansuccesspostsService。updatePostByScheduler(data);完成后删除触发器和任务if(success){log。debug(定时任务执行成功,开始清除定时任务);scheduleService。cancelScheduleJob(trigger。getKey()。getName());}}}
  第六步,发布文章的接口里PostsServiceImpl添加定时发布的任务调度方法。ServicepublicclassPostsServiceImplextendsServiceImplPostsMapper,PostsimplementsIPostsService{privatevoidhandleScheduledAfter(Postsposts){文章已经保存为草稿了,并且拿到了文章ID调用定时任务StringjobNamescheduleService。scheduleFixTimeJob(PublishPostJob。class,posts。getPostDate(),posts。getPostsId()。toString());LOGGER。debug(定时任务{}开始执行,jobName);}}
  好,我们现在启动服务,通过Swagger来测试一下,注意设置文章的定时发布时间。
  查看Quartz的数据表qrtzcrontriggers,发现任务已经添加进来了。
  qrtzjobdetails表里也可以查看具体的任务详情。
  文章定时发布的时间到了之后,在日志里也可以看到Quartz的执行日志。
  再次查看Quartz数据表qrtzcrontriggers和qrtzjobdetails的时候,也会发现定时任务已经清除了。
  整体上来说,SpringBoot整合Quartz还是非常丝滑的,配置少,步骤清晰,比SpringTask更强大,既能针对内存也能持久化,所以大家在遇到定时任务的时候完全可以尝试一把。
  完整的功能在编程喵实战项目中已经实现了,可以把编程喵导入到本地尝试一下。业务梳理
  简单来梳理一下编程喵定时发布文章的业务。
  1)用户在发布文章的时候可以选择定时发布,如果选择定时发布,那么就要设置定时发布的时间,暂时规定至少十分钟以后可以定时。
  2)当管理端用户选择了定时发布,那么在保存文章的时候,文章状态要先设置为草稿状态,对前端用户是不可见的状态。
  3)保存文章的时候通知Quartz,我有一个任务,你需要在某个规定的时间去执行。scheduleService。scheduleFixTimeJob(PublishPostJob。class,posts。getPostDate(),posts。getPostsId()。toString());
  4)Quartz收到这个通知后,就会在数据库中写入任务,具体的任务是到指定时间把文章从草稿的状态转为发布状态,这时候,前端用户就可以看得见文章了。获取文章的ID后获取文章,更新文章为发布的状态,还有发布的时间booleansuccesspostsService。updatePostByScheduler(data);
  同时,将任务清除。暂停触发器scheduler。pauseTrigger(newTriggerKey(jobName,defaultGroup));移除触发器中的任务scheduler。unscheduleJob(newTriggerKey(jobName,defaultGroup));删除任务scheduler。deleteJob(newJobKey(jobName,defaultGroup));
  整个过程就完成了。Quartz是如何实现定时发布文章的呢?其实也是通过Cron表达式。CronTriggercronTriggerTriggerBuilder。newTrigger()。withIdentity(jobName,defaultGroup)。withSchedule(CronScheduleBuilder。cronSchedule(cron))。build();
  也就是当我们传入一个指定时间后,通过计算,计算出Cron表达式。StringstartCronString。format(ddddd?d,DateUtil。second(startTime),DateUtil。minute(startTime),DateUtil。hour(startTime,true),DateUtil。dayOfMonth(startTime),DateUtil。month(startTime)1,DateUtil。year(startTime));
  在Quartz中,有两类线程:Scheduler调度线程和任务执行线程。任务执行线程:Quartz不会在主线程(QuartzSchedulerThread)中处理用户的Job。Quartz把线程管理的职责委托给ThreadPool,一般的设置使用SimpleThreadPool。SimpleThreadPool创建了一定数量的WorkerThread实例来使得Job能够在线程中进行处理。WorkerThread是定义在SimpleThreadPool类中的内部类,它实质上就是一个线程。QuartzSchedulerThread调度主线程:QuartzScheduler被创建时创建一个QuartzSchedulerThread实例。源码路径
  编程喵:https:github。comitwangercodingmorecodingmorespringtask:https:github。comitwangercodingmorelearningcodingmorequartz:https:github。comitwangercodingmorelearning
  本文已收录到GitHub上星标2。4k的开源专栏《Java程序员进阶之路》,据说每一个优秀的Java程序员都喜欢她,风趣幽默、通俗易懂。内容包括Java基础、Java并发编程、Java虚拟机、Java企业级开发、Java面试等核心知识点。学Java,就认准Java程序员进阶之路。
  https:github。comitwangertoBeBetterJavaer
  star了这个仓库就等于你拥有了成为了一名优秀Java工程师的潜力。该开源仓库最近又上GitHubtrending榜单了,看来是大家都非常认可呀!
  没有什么使我停留除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。
  来源:https:www。cnblogs。comqinggeep16354218。html
  做程序员,圈子和学习最重要因为有有了圈子可以让你少走弯路,扩宽人脉,扩展思路,学习他人的一些经验及学习方法!同时在这分享一下是一直以来整理的Java后端进阶笔记文档和学习资料免费分享给大家!需要资料的朋友私信我扣【06】

秋瓷炫前半生颠沛流离的,婚后老公屡次偷腥,惨过林品如谢谢关注,谢谢浏览。秋瓷炫作为韩国演员,却深受中国网友的喜爱。这离不开秋瓷炫过硬的演技实力以及亲切可人的爽朗性格。尤其是在成为中国儿媳后,秋瓷炫的生活得到了更……张军又惹争议,国羽发布奇葩招人政策男队身高不满1米85将劝退自从李永波退休之后,张军就接手了中国羽毛球梦之队,尽管外界对于张军的评价大多是负面的,不过他的地位没有受到影响,哪怕是此前国羽在汤尤杯惨败,也没有让张军付出应有的代价。然而,就……19岁!身高2米21,余嘉豪冲击NBA选秀前景如何?选秀专家自从余嘉豪结束新赛季的CBA比赛任务之后,他就通过个人社交媒体发声,即将前往美国挑战NBA选秀的话题,吸引着众多媒体和球迷的关注。从CBA首个赛季的表现而言,整体可圈可点,2米……小小探险家的童话作文3篇导语:探险,是一项神秘而又刺激的挑战。走在未知的道路上,探险帮我们解开了一个又一个神秘的面纱。我们都需要探险家,需要开拓者。下面小编为大家整理了小小探险家的童话作文,欢迎你们阅……贾静雯这次下真功夫了,穿健美裤家中倒立,窄腰翘臀尽显少女身材如今的健美裤可以说是时尚的顶梁柱,几乎到了人手一件的地步,不过健美裤这种特殊单品,对于驾驭者的身材要求非常之高,容不得半点赘肉,尤其是大腿内侧,稍微有一点点赘肉就会影响造型的美……让人越来越精致的8件小事!(值得收藏)一个人最好的生活状态是什么呢?有人觉得过得糙一点,生活才有人气;有人却觉得,生活是一个人的外在形象,让自己保持品质生活,才是对它的尊重,是对自己的重视。这样的……荆轲刺秦王读书笔记看完一本名著后,相信大家的视野一定开拓了不少,这时最关键的读书笔记不能忘了哦。现在你是否对读书笔记一筹莫展呢?以下是小编为大家收集的荆轲刺秦王读书笔记,希望对大家有所帮助。荆轲……基本确定!广厦冠军后卫意外离队曾是CBA助攻王或加盟山东挑大广厦队在上赛季和辽宁队的交战当中被4:0横扫出局,虽然第二名的成绩能够达到预期,但是主将受伤使得广厦队彻底失去战斗力,仍然让球迷倍感惋惜,所以今年夏天广厦队的阵容调整工作备受期……他的花开,他的绮梦,永远停留在了二十年前的那个夏天文萧九来源:《南风》杂志【最是绮梦难寻】图片来源:堆糖(侵删)十二点的钟声忽然响起,我忍不住回头,只见邵和正半靠在石墙上,目光幽深难言。五彩斑斓的烟花次第绽放……2022年房地产持续遇冷,有人预测,一线2万二线8千三四线2过去的房地产有多疯狂,如今的房地产就有多悲哀,回望整个2021年,这一年时间中看到了整个房地产的变局。上半年市场处于极度疯狂的状态,让不少老百姓都认为房地产要重回2016……论价值一个人的价值如何,在于他拥有什么,当然绝对不仅限于金钱与物质。如果你想把自己变得有价值,必须朝着认定的目标作坚持不懈的努力。一个人的价值通常被低估,相反,他们拥有的……和数学成为朋友作文无论是身处学校还是步入社会,大家都尝试过写作文吧,写作文是培养人们的观察力、联想力、想象力、思考力和记忆力的重要手段。怎么写作文才能避免踩雷呢?下面是小编收集整理的和数学成为朋……
王楠确诊癌症之后,男友却选择向她求婚,王楠没有想到文微史解读编辑微史解读2021年的国庆假期期间,奥运乒乓球冠军们和两位教练齐聚在山东威海。这一次,他们不是来这里参加集训的,而是来领奖的,一人一套房子的豪华奖……名人名言大全励志带作者每个人都是一样,总是要迈出第一步。下面小编整理了名人名言,欢迎阅读!1。每一个成功者都有一个开始。勇于开始,才能找到成功的路。2。世界上只有想不通的人,没有走不通的……想起了父亲苍老的脸作文范文夜,好静谧,柔和的月光洒了一地银白;夜,好深沉,父亲那时起时落的鼾声犹如一首动人的月光曲,回荡在夜色上空。望着熟睡中父亲的脸,我的思绪也飘向那片圣洁的夜空小时候,我常以有……激动人心的万圣节作文在万圣节之夜,不少人会之欢欣雀跃,激动万分,尖叫连连。今天小编分享激动人心的万圣节优秀作文,请各位读者好好欣赏和借鉴。第一篇激动人心的万圣节我们心中盼望以久的万圣节……电影皇帝金焰今生愧对秦怡,终于在天堂与妻子相会了前段时间,老艺术家秦怡去世,不少娱乐圈的人都发文悼念她,可以说她是美了一辈子也苦了一辈子。第一任丈夫陈天国酗酒家暴,第二任丈夫金焰让她劳苦了半生,……小精灵有村架纯的爱情电影之路影视杂谈有村架纯有着标准的日系清纯娃娃脸型,笑容甜美,看起来十分乖巧恬静,她长发飘飘,清纯动人。身穿泳装的她呈现出了好身材。飘逸的垂肩直发凸现了无辜的大眼睛,栗棕色长发的……高考名言1、决战高考,改变命运。屡挫屡战,笑傲群雄。2、没有常胜,只有常省(xing)。3、笑看人生峰高处,唯有磨难多正果。4、苦海有涯。而学无涯,志者战高考,惰者畏……人民的名义中的真BOSS低调内敛,霸气十足看《人民的名义》,看一遍爽,再看一遍还是爽。为什么?因为每看一遍就会发现,里面每个人都不简单,那些到一定职位的人,背后都站着一位大BOSS,当然职位有高低,BOSS的血也……赵本山儿子花费百万购买名犬惹质疑,本人回应看不惯的人都是仇富赵本山很长一段时间都没有露面,而他却先后因为龙凤胎儿女陷入争议之中。这次因为他的宝贝儿子赵一楠(小名大牛)花费320万从国外购买宠物犬,其中光运费就占据了60万。赵一楠的这一行……精选端午节包粽子的作文400字合集5篇在学习、工作、生活中,大家最不陌生的就是作文了吧,作文是人们以书面形式表情达意的言语活动。还是对作文一筹莫展吗?以下是小编为大家收集的端午节包粽子的作文400字5篇,仅供参考,……高中作文伟大的老师老师的泪是无私的,是圣洁的,是伟大的,它不亚于母亲的泪。尽管我现在才体会到,也让我感到热血沸腾,惭愧万分。一日,在上政治课时,政治老师发了一通脾气,还把讲桌上的粉笔盒连同……冰箱里面放一枚硬币,有很多用处看完涨知识了看似一枚小小的硬币,关键时刻能够保你一命,现在冰箱每家每户都有,但是好多人都没有把硬币放进冰箱里,如果没有的话,也没关系,把本文看完,你就知道硬币有哪些用处了。在我们现实……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网