Spring Quartz Batch

uni-app/小程序生命周期函数执行时机深度解析与实战解决方案 在移动应用开发中,页面生命周期管理是构建稳定用户体验的核心基础。其原理在于框架通过定义一系列回调函数(如onLoad、onShow),精确控制页面从创建、显示到销毁的各个阶段,以实现资源的高效管理和状态同步。掌握生命周期机制的技术价值在于,它能有效避免数据重复加载、逻辑错误执行等常见问题,是提升应用性能与稳定性的关键。尤其在电商、社交等需要频繁页面跳转与状态维护的应用场景中,对生命周期的深入理解至关重要。本文聚焦于uni-app及微信小程序开发中常见的生命周期“失控”现象,例如onShow重复执行和tabB 阅读详情

WEB-INF\web.xml

 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
   classpath:/job-bean.xml
  </param-value>
 </context-param>

 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

WEB-INF\classes\job-bean.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans ...>

 <import resource="classpath:simple-job-launcher-context.xml"/>
 <import resource="classpath:myHelloJob.xml"/>
 
 <bean id="helloJob" class="org.springframework.scheduling.quartz.JobDetailBean">
  <property name="jobClass" value="quartz.example.HelloJob" />
  <property name="jobDataAsMap">
   <map>
    <entry key="launcher" value-ref="jobLauncher"/>
    <entry key="job" value-ref="myHelloJob"/>
   </map>
  </property>
 </bean>

 <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
  <property name="jobDetail" ref="helloJob" />
  <property name="startDelay" value="10000" />
  <property name="repeatInterval" value="50000" />
 </bean>
 
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
   <list>
    <ref bean="simpleTrigger"/>
   </list>
  </property>
 </bean>
</beans>

WEB-INF\classes\simple-job-launcher-context.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans ...>

 <import resource="classpath:data-source-context.xml"/>

 <bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
  <property name="databaseType" value="MYSQL" /> 
  <property name="dataSource" ref="dataSource" />
  <property name="transactionManager" ref="transctionManager" /> 
 </bean>

 <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
  <property name="jobRepository" ref="jobRepository" />
 </bean>

 <bean id="simpleJob" class="org.springframework.batch.core.job.SimpleJob" abstract="true">
  <property name="jobRepository" ref="jobRepository" />
 </bean>

 <bean id="taskletStep" class="org.springframework.batch.core.step.tasklet.TaskletStep" abstract="true">
  <property name="jobRepository" ref="jobRepository" />
  <property name="transactionManager" ref="transctionManager" /> 
 </bean>

</beans>

WEB-INF\classes\data-source-context.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans ...>

 <import resource="classpath:data-source-context-init.xml"/>

 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="org.gjt.mm.mysql.Driver"></property>
  <property name="url" value="jdbc:mysql://127.0.0.1:5141/batch"></property>
  <property name="username" value="sa"></property>
  <property name="password" value="sqldba"></property>
 </bean>

 <bean id="transctionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
  lazy-init="true">
  <property name="dataSource" ref="dataSource"></property>
 </bean>

</beans>

WEB-INF\classes\data-source-context-init.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans ...>

 <bean id="initializingFactoryBean" class="quartz.example.InitializingDataSourceFactoryBean">
  <property name="dataSource" ref="dataSource"></property>
  <property name="initScript">
   <value>classpath:schema-mysql.sql</value>
  </property>
 </bean>
 
</beans>

WEB-INF\classes\myHelloJob.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans ...>

 <bean id="myHelloJob" parent="simpleJob">
  <property name="name" value="myHelloJob" />
  <property name="steps">
   <list>
    <bean id="firstHello" parent="taskletStep">
     <property name="tasklet">
      <bean class="quartz.example.MyHello">
       <property name="message" value="Hi~" />
      </bean>
     </property>
    </bean>
   </list>
  </property>
 </bean>
 
</beans>

package quartz.example;

public class InitializingDataSourceFactoryBean extends AbstractFactoryBean {

 private Resource initScript;
 private Resource destroyScript;
 DataSource dataSource;

 protected Object createInstance() throws Exception {
  
  Assert.notNull(dataSource);
  try {
   doExecuteScript(destroyScript);
  }
  catch (Exception e) {
   logger.debug("Could not execute destroy script [" + destroyScript + "]", e);
  }
  doExecuteScript(initScript);
  return dataSource;
 }

 private void doExecuteScript(final Resource scriptResource) {
  
  try {
  
   if (scriptResource == null || !scriptResource.exists())
    return;
   TransactionTemplate transactionTemplate = new TransactionTemplate(new DataSourceTransactionManager(dataSource));
   if (initScript != null) {
    transactionTemplate.execute(new TransactionCallback() {

     public Object doInTransaction(TransactionStatus status) {
      JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
      String[] scripts;
      try {
       scripts = StringUtils.delimitedListToStringArray(stripComments(IOUtils.readLines(scriptResource
         .getInputStream())), ";");
      }
      catch (IOException e) {
       throw new BeanInitializationException("Cannot load script from [" + initScript + "]", e);
      }
      for (int i = 0; i < scripts.length; i++) {
       String script = scripts[i].trim();
       if (StringUtils.hasText(script)) {
        jdbcTemplate.execute(scripts[i]);
       }
      }
      return null;
     }

    });

   }
  } catch (Exception e) {
   logger.debug("기존에 스키마가 생성된 경우 오류가 발생 할 수 있으며, 오류 발생시 무시", e);
  }
 }

 private String stripComments(List list) {
  StringBuffer buffer = new StringBuffer();
  for (Iterator iter = list.iterator(); iter.hasNext();) {
   String line = (String) iter.next();
   if (!line.startsWith("//") && !line.startsWith("--")) {
    buffer.append(line + "\n");
   }
  }
  return buffer.toString();
 }

package quartz.example;

import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.InitializingBean;

public class MyHello implements InitializingBean, Tasklet {
 
 private static Log _log = LogFactory.getLog(MyHello.class);
 
 private String message = "";
 
 public void setMessage(String message) {
  this.message = message;
 }

 @Override
 public void afterPropertiesSet() throws Exception {
  _log.info("========= " + this.getClass().getSimpleName() + "=============" + message);
 }

 @Override
 public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws Exception {
  _log.info(">>>>>>>>>>> " + this.getClass().getSimpleName() + "=====" + message );
  
  return RepeatStatus.FINISHED;
 }

}

package quartz.example;

import java.util.Date;
import java.util.Iterator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobExecutionContext;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.scheduling.quartz.QuartzJobBean;

//public class HelloJob implements Job {
public class HelloJob extends QuartzJobBean {

  private static Log _log = LogFactory.getLog(HelloJob.class);
    
  private JobLauncher launcher;
  private Job job;
    
  private int count = 0;
    
  public void setLauncher(JobLauncher launcher) {
    this.launcher = launcher;
  }

  public void setJob(Job job) {
    this.job = job;
  }

  public HelloJob() {
  }
    
  protected void executeInternal(JobExecutionContext context) {
    _log.info("<<<<<<<< " +  " Hello World! - " + new Date() + " >>>>>>>>");
     
    System.out.println("aaaa");
     
    JobParametersBuilder jobParameterBulider = new JobParametersBuilder();
    jobParameterBulider.addDate("date", new Date());
     
    try {
      JobExecution jobExecution = launcher.run(job, jobParameterBulider.toJobParameters());
   
      for(Iterator<StepExecution> iterator = 
        jobExecution.getStepExecutions().iterator(); iterator.hasNext();) {
          StepExecution stepExecution = iterator.next();
        }
    } catch (JobExecutionAlreadyRunningException e) {
      e.printStackTrace();
    } catch (JobRestartException e) {
      e.printStackTrace();
    } catch (JobInstanceAlreadyCompleteException e) {
      e.printStackTrace();
    }
  }
}

【小程序&多端开发】页面跳转的多种方式 在UniApp小程序开发中,页面跳转不仅是API的调用,更是对页面生命周期和页面栈管理的深度理解。常规跳转用navigateTo,但要注意10层栈限制;不可逆跳转用redirectTo,优化栈深度;底部导航用switchTab,别忘了它不能带参数的傲娇属性;终极清场用reLaunch,处理登出和深链接;参数传递,简单参数URL拼接,复杂参数首选;权限控制,一定要做全局路由拦截,避免硬编码散落各处。 阅读详情

相关推荐

从逻辑门到存储阵列:NAND与NOR闪存命名与结构原理详解

在数字电路与半导体存储器领域,逻辑门是构建一切复杂功能的基础单元,其输入输出关系定义了计算与存储的基本原理。与非门(NAND)和或非门(NOR)作为通用逻辑门,其真值表和行为模式深刻影响了芯片设计。基于这些原理,现代闪存技术发展出了两种核心架构:NAND Flash和NOR Flash。这两种闪存的命名直接源于其内部存储单元阵列的连接方式,分别模拟了与非门和或非门的逻辑关系。这种结构差异决定了它们根本的技术价值:NOR Flash采用并联结构,支持快速随机读取,适用于代码存储与原地执行(XiP);而NAND

weixin_33377602的博客 339

SpringBoot + SpringBatch + Quartz整合定时批量任务

SpringBoot + SpringBatch + Quartz整合定时批量任务

scorpio的博客 9569

Webug4.0 打靶笔记

一、Webug 的安装 (1)基本信息 WeBug 名称定义为”我们的漏洞”靶场环境 ,基础环境是基于 PHP/mysql 制作搭建而成,中级环境与高级环境分别都是由互联网漏洞事件而收集的漏洞存在的操作环境。部分漏洞是基于Windows操作系统的漏洞所以将WeBug的web环境都装在了一个纯净版的Windows 2003的虚拟机中。在 webug3.0 发布后的四百多天 226安全团队终于在大年初二发布了 webug 的 4.0 版本。 (2)虚拟机的安装 最新超详细VMware虚拟机下载与安装_隐

m0_60716947的博客 6128

Quartz集群并发执行导致重复调度问题

Quartz集群并发执行导致重复调度

qq_14928305的博客 5651

从零开始讲DDR(7)——modelsim独立仿真DDR4

本文主要内容为DDR4 MIG ip核仿真,modelsim独立仿真DDR4。在进行DDR仿真的时候,我们会面临一个以往常规仿真不存在的问题:DDR本身并不是一个我们通过RTL代码设计出来的部件,常规的模块或者IP仿真,都是基于RTL代码就能进行的,但是回顾一下我们DDR的开发流程,调用的IP核也只是MIG ip,其本质是一个DDRC+DDRPYH的组合,并不能模拟任何DDR本身的行为,因此,在进行仿真之前,我们首先要做的就是获取DDR的仿真模型。

apple_53311083的博客 3225

Xilinx FPGA平台GTX简易使用教程(一)GTX基础知识

理解GTX的必备姿势,学起来!

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 2万+

springbatch 和 quartz 处理job框架

一款轻量的、全面的批处理框架,用于开发强大的日常运营的企业级批处理应用程序。 在大型企业中,由于业务复杂、数据量大、数据格式不同、数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理。而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理。这样的过程就是“批处理”。 典型的批处理流程是读数据、处理数据、写数据的三步式架构——从数据库、文件或队列中读取大量数据,然后通过业务规则处理数据...

qq_35306443的博客 6759

LeRobot 入门教程(十三)集成自定义的机器人、相机等硬件

本文详细介绍了如何将自定义机器人集成到LeRobot生态系统的完整流程。主要内容包括:1)硬件准备与通信接口选择;2)继承Robot基类实现标准接口;3)定义观察特征和动作特征;4)处理设备连接/断开逻辑;5)支持校准与配置;6)实现核心传感器读取和动作发送功能;7)可选遥操作器集成;8)遵循4项规范打包自定义设备(命名前缀、类名对应、文件结构、模块暴露);9)提供了完整实现示例。通过该方案,开发者可让自定义机器人兼容LeRobot的数据采集、控制管道和策略训练等全套工具链。

2506_90492529的博客 1902

使用uni.navigateTo()传递对象

1.跳转页面 detail(item){ let obj = JSON.stringify(item) uni.navigateTo({ url:'articleDetail?obj='+encodeURIComponent(obj) }) }, 2.接收页面 在data中定义obj={} onLoad(options) { this.obj=JSON.parse(decodeURIComponent(options.obj)) console.l

qq_45894929的博客 4105

【零基础学习CAPL】——弹窗信息提示

不用手动制作Panel窗口,直接使用CAPL脚本实现弹窗提示。//没有wait超时,等待测试人员确认//有wait超时,对话框在超时后自动终止//有wait超时,可以显示一个资源,即对话框可以显示额外的信息。/*参数说明text:显示在弹窗中的内容,长度限制在4096字符timeout:弹窗自动结束的时间,单位:ms。若为0,则无超时控制heading:对话框文本上方的标题。字符串最大长度限制在256个字符。resource:URL或文件路径。字符串的最大长度是有限的(512个字符)。

LOVE135149的博客 264

Android 14.0 SystemUI状态栏居中显示时间和修改时间显示样式

在14.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了

安卓兼职framework和app工程师的博客 978

比手动快10倍:AI一键生成uni.navigateto模板

但每次手动编写跳转代码,不仅耗时,还容易出错。今天分享5个高频场景的标准化模板,配合AI工具快速生成,效率直接拉满。传统方式需要手动拼接URL参数,现在只需告诉AI需求,就能生成完整代码。AI模板会自动处理对象转字符串的过程,并在目标页反序列化时添加容错处理。时,只需输入“生成带参数的uni.navigateto代码”这样的自然语言,就能立即获得这些标准化模板。对于包含页面跳转逻辑的demo,可以直接在线查看运行效果,特别适合快速验证功能逻辑。AI生成的模板会准确识别tab页场景,自动选择正确的API。

JetRaven12的博客 387

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

uni-app页面跳转以及传值

在uni-app中是没有路由这一说法的,想要跳转页面官方给出了以下集中方法: 一、通过配置pages.json里面的tabBar来实现,主要写法请参考官方文档: uni-app官方配置pages.json方法 二、通过官方给的组件navigator来实现跳转(类似a标签),主要样式如下 <navigator url="跳转地址" open-type="跳转方式"></navigator> 注意:在添加url地址时不要加.vue后缀 open-type的值主要有以下几..

m0_55240753的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

优化uni-app页面间的传参跳转【兼容多端】

options传值简单的场景好用。对于传递复杂对象options就有点力不从心了,毕竟URL模式GET传递参数的长度有限。此时需要采用eventChannel模式,而默认的模式使用复杂,需要进行再优化 虽然eventChannel也实现了上下级页面(对于页面栈式应用,我称之为上下级比较合适)传递参数,但是灵活度高也就意味着使用复杂。 之前写过ElementUI的窗体模式封装,参考同样的理念。我需要实现一种更贴近开发逻辑的调用效果

applebomb的专栏 1501

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

uni-app页面跳转参数太长问题

跳转: uni.navigateTo({ url:'../xxxx/xxxx? samplingdetail='+encodeURIComponent(JSON.stringify(item)) }) 接收端 var xxxx=JSON.parse(decodeURIComponent(options.samplingdetail))

weixin_43926335的博客 4540

uni-app页面间传递对象

uni-app页面间传递对象

lywdn的博客 158

快马AI助力uni-app开发:一键生成高效页面导航功能

最近在用uni-app开发一个跨平台应用时,发现页面导航功能是每个项目都绕不开的核心需求。特别是像电商类应用,商品列表到详情页的跳转、底部导航栏切换等场景都需要稳定高效的导航实现。uni.navigateTo最大的特点是能在不关闭当前页面的情况下打开新页面,这对需要保留浏览状态的场景特别有用。只需输入"生成uni-app带底部导航的商品详情页跳转功能",就能得到包含参数传递、返回逻辑的全套解决方案。最惊艳的是生成的项目可以直接一键部署预览效果,省去了手动配置开发环境的麻烦。快速生成完整解决方案。

SapphireOwl29的博客 354

uniapp页面间传递参数

一、传值 传参页面 rowclick(item) { let number = item.number; uni.navigateTo({ url: '/pages/check/check-detail?number=' + number }) }, 接受参数页面: onLoad(options) { this.number = options.number; }, 二、传对象 传参页面 rowclick(item) { let number = item

qq_43026206的博客 1643

uni-app 页面跳转传值数据过长问题

uni-app 页面跳转传值数据过长问题

xniYa的博客 677

如何高效使用uni-app路由系统:多端统一的路由管理完整指南

uni-app是一个使用Vue.js开发跨平台应用的框架,其路由系统提供了多端统一的路由管理方案,让开发者能够轻松实现页面之间的跳转和数据传递。无论是开发小程序、App还是H5,uni-app路由系统都能提供一致的使用体验,极大简化了跨平台开发的复杂性。 ## uni-app路由系统核心优势 uni-app路由系统的设计理念是"一次编码,多端运行",其核心优势体现在以下几个方面: - **多

gitblog_02628的博客 351

uni-app路由与页面生命周期深度详解:实战落地与避坑指南

路由是uni-app页面流转的调度核心,生命周期是页面状态管理的底层准则,二者的联动关系贯穿整个项目的业务逻辑。路由的本质是页面栈管控,不同API对应不同页面留存与销毁规则;生命周期各钩子拥有固定执行时机与专属业务场景,不可随意混用。在实际项目开发中,只要严格遵循“路由匹配业务场景、逻辑匹配生命周期钩子、创建即销毁”三大原则,就能彻底规避90%以上的页面刷新异常、参数报错、内存泄漏、跳转逻辑bug。

2402_88947054的博客 205

uniapp传值注意事项

如果含有特殊字符,默认会截掉,需要encodeURIComponent处理。ps: 需要对要传的对象作处理 encodeURIComponent。接收 decodeURIComponent。

qq_42038997的博客 179

UniApp 微信小程序|页面跳转全场景选型 + 长短参数 / 多级参数传递终极方案(彻底根治传参 BUG)

原因:URL 不支持对象直接拼接解决:复杂对象一律用,禁止 URL 传对象简单短参数:优先 URL 拼接,轻量高效;对象 / 数组 / 长文本:一律 eventChannel,根治所有传参错乱;多级页面传参:杜绝层层透传,用事件通道 + 临时缓存;Tab 页面传参:放弃 URL,只用 storage;反向页面刷新:eventChannel 回调优于 onShow 无脑刷新;跳转方式严格按场景选择,避免页面栈溢出、返回逻辑异常。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 749
上一篇: 使用Quartz或Timer完成时序调度工作
下一篇: plsql developer格式化sql为java代码
VirusFu
博客等级 码龄21年 51粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值