首页 文章 精选 留言 我的

精选列表

搜索[声音定制],共10002篇文章
优秀的个人博客,低调大师

定制linux内核+Busybox+dropbear实现远程登录

简单介绍下各阶段工作流程: POST:开机后,加载BIOS信息(里面包含各硬件的相关信息) BIOS(boot sequence):选择(设备)启动项,然后读取MBR信息 Boot Loader:初始化硬件、建立内存空间映射,读取grub配置文件 Initrd:加载内核(硬件检测及初始化、挂载根文件系统)0→启动第一个进程init→该程序读出/etc/inittab、/etc/rc.d/rc.sysinit、/etc/rc.d/rc.local文件 Shell:启动/bin/login程序,进入登录界面 进入实验部分: 一、环境搭建 1、虚拟机(server1)上添加一个硬盘 2、在系统中给该磁盘进行分区 [root@localhost~]#fdisk/dev/sdb 3、格式化 [root@localhost~]#mke2fs-text4/dev/sdb1 [root@localhost~]#mke2fs-text4/dev/sdb2 [root@localhost~]#mkswap/dev/sdb3 4、挂载 [root@localhost~]#mkdir/mnt/{sysroot,boot}#创建挂载目录 [root@localhost~]#mount/dev/sdb1/mnt/boot/ [root@localhost~]#mount/dev/sdb2/mnt/sysroot/ 5、安装grub [root@localhost~]#grub-install--root-directory=/mnt/dev/sdb 6、创建linux各目录 [root@localhost~]#cd/mnt/sysroot/ [root@localhost~]#mkdir-pvetc/rc.dvar/logrootprocsyssrvbootmnttmphomedevliblib64 二、编译内核 [root@localhost~]#tarxflinux-3.13.6.tar.xz-C/usr/src/#解压 [root@localhost~]#cd/usr/src/ [root@localhostsrc]#ln-slinux-3.13.6linux#创建软链接 [root@localhostsrc]#cdlinux [root@localhostlinux]#yumgroupinstall"DevelopmentTools"-y#安装开发包组 [root@localhostlinux]#makeallnoconfig#重置配置选项 [root@localhostlinux]#makemenuconfig 如果make menuconfig时报错: 提示:缺少ncurses-devel库文件 [root@localhostlinux]#yum-yinstallncurses-devel [root@localhostlinux]#makemenuconfig#再次进行 [*]64bitkernel#64位支持 [*]gerernalsetup ()localversion-appendtokernelrelease#版本号 [*]Enableloadablemodualsupport#允许模块加载 ->Progressortypeandfeatures ProcessorFamily(Core2/newerXeon)#自行选择处理器类型 [*]Symmetricmulti-processingsupport#支持多核 ->BusOptions(PCIetc.) [*]PCIsupport#支持PCI总线 ->Filesystem [*]TheExtended4(ext)filesystem#支持ext4文件系统 ->Executablefileformats/Emulations#可执行文件系统 [*]KernelsupportforELFbinaries#支持ELF二进制程序 [*]Kernelsupportforscriptsstartingwith#!#支持脚本 [*]Networkingsupport ->Networkingoptions [*]Unixdomainsockets [*]UNIX:socketmonitoringinterface [*]TCP/IPnetworking [*]IP:multicasting#ip多播协议 [*]IP:advancedrouter#高级路由协议 [*]IP:kernellevelautoconfiguration#内核级别配置 [*]IP:DHCPsupport#DHCP服务 [*]IP:BOOTPsupport [*]IP:RARPSupport#RARP协议 [*]IP:TCPsyncookiesupport#tcp同步状态 ->DeviceDrivers ->GernalDriverOptions [*]Maintainadevtmpfsfilesystemtomountat/dev#使用devtmpfs机制挂载设备文件 [*]Automountdevtmpfsat/dev,afterthekernelmountedtherootfs#自动挂载 ->SCSIdevicesupport [*]SCSIdeveicesupport [*]SCSIdisksupport [*]FusionMPTdevicesupport#支持虚拟磁盘 [*]FusionMPTScsiHostdriversforSPI#虚拟磁盘 [*]FusionMPTmiscdevice(ioctl)driver#磁盘初始化 [*]Networkdevicesupport [*]Networkcoredriversupport#网络核心驱动 [*]Ethernetdriversupport#以太网卡驱动 [*]Inteldevices(NEW) [*]Intel(R)PRO/1000GigabitEthernetsupport [*]Intel(R)PRO/1000PCI-ExpressGigabitEthernetsupport ->InputDevicesupport [*]Mouseinterface [*]Keyboards#键盘 [*]Mice#ps/2 [*]USBsupport [*]SupportforHost-sideUSB [*]xHCIHCD(USB2.0)support [*]EHCIHCD(USB3.0)support [*]OHCIHCD(USB1.1)support [root@localhostlinux]#makebzImage-j3#只编译内核,并且使用3个线程 [root@localhostlinux]#cparch/x86_64/boot/bzImage/mnt/boot/#拷贝内核 三、安装busybox 安装busybox需要依赖glibc-static 安装glibc-static 包在DVD2中,如何没有DVD2比如我..,自己搭建网络yum源安装 root@localhost~]#wgethttp://mirrors.163.com/.help/CentOS6-Base-163.repo这是网易yum源的配置文件 [root@localhost~]#yumcleanall/#生效刚刚加载的yum仓库 [root@localhost~]#yum-yinstallglibc-static [root@localhost~]#tarxfbusybox-1.22.1.tar.bz2 [root@localhost~]#cdbusybox-1.22.1 [root@localhostbusybox-1.22.1]#makemenuconfig ->BusyboxSettings ->BuildOptions [*]BuildBusyBoxasastaticbinary(nosharedlibs) [root@localhostbusybox-1.22.1]#make&&makeinstall [root@localhostbusybox-1.22.1]#cp-a_install/*/mnt/sysroot/ 提供grub.conf文件: [root@localhost~]#vim/mnt/boot/grub/grub.conf default=0 timeout=5 titleLinux(3.13.6) root(hd0,0) kernel/bzImageroroot=/dev/sda2init=/sbin/init [root@localhost~]#sync#把内存缓冲区的数据立即写入磁盘中 测试: 添加新的虚拟机(server2) 注意选择磁盘时要选择之前创建的磁盘 添加完成后,把server1挂起或关机,然后server2开机 启动正常,但提示没有初始化文件 四、提供初始化文件(etc/fstab etc/inittabetc/rc.d/rc.sysinit) [root@localhostsysroot]#vimetc/fstab /dev/sdb1/bootext4defaults00 /dev/sdb2/ext4defaults00 /dev/sdb3swapswapdefaults00 proc/procprocdefaults00 sysfs/syssysfsdefaults00 [root@localhostsysroot]#vimetc/inittab ::sysinit:/etc/rc.d/rc.sysinit ::respawn:/sbin/getty19200tty1 ::respawn:/sbin/getty19200tty2 ::respawn:/sbin/getty19200tty3 ::respawn:/sbin/getty19200tty4 ::respawn:/sbin/getty19200tty5 ::respawn:/sbin/getty19200tty6 ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount-a-r [root@localhostsysroot]#vimetc/rc.d/rc.sysinit #!/bin/sh # echo-e"\tWelcometo\033[36mLinux\033[0m" [-r/etc/sysconfig/network]&&./etc/sysconfig/network [-z"$HOSTNAME"-o"$HOSTNAME"=="(none)"]&&HOSTNAME=localhost /bin/hostname$HOSTNAME mount-a#基于/etc/fstab文件挂载设备 mdev-s#挂载内核所需设备文件 mount-oremount-rw/#把根挂载成可读写 ifconfiglo127.0.0.1#配置网卡信息 ifconfigeth0192.168.199.222#配置网卡信息 exportPS1="[\u@\h\w]$"#导出PS1路径 exportPATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"#修改环境变量 [root@localhostsysroot]#chmod+xetc/rc.d/rc.sysinit 提供账号和密码文件: [root@localhostsysroot]#head-1/etc/passwd>etc/passwd [root@localhostsysroot]#vimetc/passwd [root@localhostsysroot]#head-1/etc/group>etc/group [root@localhostsysroot]#head-1/etc/shadow>etc/shadow [root@localhostsysroot]#chmod400etc/shadow 提供认证库文件: [root@localhost~]#cp-d/lib64/libnss_files*/mnt/sysroot/lib64/ [root@localhost~]#cp-d/usr/lib64/libnss3.so/mnt/sysroot/usr/lib64/ [root@localhost~]#mkdir/mnt/sysroot/usr/lib64 [root@localhost~]#cp-d/usr/lib64/libnss3.so/mnt/sysroot/usr/lib64/ [root@localhost~]#cp-d/usr/lib64/libnss_files.so/mnt/sysroot/usr/lib64/ [root@localhost~]#cp/etc/nsswitch.conf/mnt/sysroot/etc/ [root@localhost~]#cp/etc/shells/mnt/sysroot/etc/ 提供主机名: [root@localhostsysroot]#mkdiretc/sysconfig [root@localhostsysroot]#vimetc/sysconfig/network HOSTNAME=biao.com [root@localhostsysroot]#sync 测试: 本地登陆成功! 五、提供ssh服务 [root@localhost~]#tarxfdropbear-2016.73.tar.bz2 [root@localhost~]#cddropbear-2016.73 [root@localhostdropbear-2016.73]#./configure 预编译时如果报如下错误: #yum-yinstallzlib-devel#安装缺少的库 #./configure#再次预编译 [root@localhostdropbear-2016.73]#makePROGRAMS="dropbeardbclientdropbearkeyscp" [root@localhostdropbear-2016.73]#makePROGRAMS="dropbeardbclientdropbearkeydropbearconvertscp"install 命令移植脚本: #!/bin/bash aimDir=/mnt/sysroot cmdInput(){ ifwhich$cmd&>/dev/null;then cmdPath=`which--skip-alias$cmd` else echo"Nosuchcommand." return5 fi } cpCmd(){ cmdDir=`dirname$cmdPath` [-d${aimDir}${cmdDir}]||mkdir-p${aimDir}${cmdDir} [-f$cmdPath]&&cp$cmdPath${aimDir}${cmdDir} } cpLib(){ forlibPathin`ldd$cmdPath|grep-o"/[^[:space:]]\{1,\}"`;do libDir=`dirname$libPath` [-d${aimDir}${libDir}]||mkdir-p${aimDir}${libDir} [-f$libPath]&&cp$libPath${aimDir}${libDir} done } echo"Youcaninput[q|Q]quit." whiletrue;do read-p"Enteracommand:"cmd if[["$cmd"=~\(|q|Q|\)]];then echo"Youchoosequit." exit0 fi cmdInput [$?-eq5]&&continue cpCmd cpLib [$?-eq0]&&echo-e"\033[36mCopysuccessful.\033[0m" Done 移植所需的命令: [root@localhost~]#bashcp.sh Youcaninput[q|Q]quit. Enteracommand:dropbear Copysuccessful. Enteracommand:dropbearkey Copysuccessful. Enteracommand:q Youchoosequit. 生成密钥: [root@localhost~]#mkdir/mnt/sysroot/etc/dropbear [root@localhost~]#dropbearkey-trsa-f/mnt/sysroot/etc/dropbear/dropbear_rsa_host_key-s2048 [root@localhost~]#dropbearkey-tdss-f/mnt/sysroot/etc/dropbear/dropbear_dss_host_key 创建pid文件存放目录: [root@localhost~]#mkdir/mnt/sysroot/var/run 挂载pts: [root@localhostsysroot]#mkdirdev/pts [root@localhostsysroot]#vimetc/fstab ........#上面省略 devpts/dev/ptsdevptsdefaults00 提供服务脚本: [root@localhostsysroot]#mkdiretc/rc.d/init.d [root@localhostsysroot]#vimetc/rc.d/init.d/dropbear #!/bin/bash # #description:dropbearsshdaemon #chkconfig:23456633 # dsskey=/etc/dropbear/dropbear_dss_host_key rsakey=/etc/dropbear/dropbear_rsa_host_key lockfile=/var/lock/subsys/dropbear pidfile=/var/run/dropbear.pid dropbear=/usr/local/sbin/dropbear dropbearkey=/usr/local/bin/dropbearkey [-r/etc/rc.d/init.d/functions]&&./etc/rc.d/init.d/functions [-r/etc/sysconfig/dropbear]&&./etc/sysconfig/dropbear keysize=1024 port=22 gendsskey(){ [-d/etc/dropbear]||mkdir/etc/dropbear echo-n"Startinggeneratethedsskey:" $dropbearkey-tdss-f$dsskey&>/dev/null RETVAL=$? if[$RETVAL-eq0];then success echo return0 else failure echo return1 fi } genrsakey(){ [-d/etc/dropbear]||mkdir/etc/dropbear echo-n"Startinggeneratethersakey:" $dropbearkey-trsa-s$keysize-f$rsakey&>/dev/null RETVAL=$? if[$RETVAL-eq0];then success echo return0 else failure echo return1 fi } start(){ [-e$dsskey]||gendsskey [-e$rsakey]||genrsakey if[-e$lockfile];then echo-n"dropbeardaemonisalreadyrunning:" success echo exit0 fi echo-n"Startingdropbear:" daemon--pidfile="$pidfile"$dropbear-p$port-d$dsskey-r$rsakey RETVAL=$? echo if[$RETVAL-eq0];then touch$lockfile return0 else rm-f$lockfile$pidfile return1 fi } stop(){ if[!-e$lockfile];then echo-n"dropbearserviceisstopped:" success echo exit1 fi echo-n"Stoppingdropbeardaemon:" killprocdropbear RETVAL=$? echo if[$RETVAL-eq0];then rm-f$lockfile$pidfile return0 else return1 fi } status(){ if[-e$lockfile];then echo"dropbearisrunning..." else echo"dropbearisstopped..." fi } usage(){ echo"Usage:dropbear{start|stop|restart|status|gendsskey|genrsakey}" } case$1in start) start;; stop) stop;; restart) stop start ;; status) status ;; gendsskey) gendsskey ;; genrsakey) genrsakey ;; *) usage ;; esac [root@localhostsysroot]#chmod+xetc/rc.d/init.d/dropbear [root@localhostsysroot]#cp/etc/rc.d/init.d/functionsetc/rc.d/init.d/ [root@localhostsysroot]#cdetc/rc.d/ [root@localhostrc.d]#ln-sinit.d/dropbeardropbear.start [root@localhostrc.d]#ln-sinit.d/dropbeardropbear.stop [root@localhostrc.d]#echo"/etc/rc.d/*.startstart">>rc.sysinit 关机脚本 [root@localhostrc.d]#vimrc.sysdown #!/bin/sh # sync#把内存缓冲区的数据立即写入磁盘中 sleep3#给系统3秒的写入时间 /etc/rc.d/*.stopstop umount-a-r Poweroff [root@localhostrc.d]vim/mnt/sysroot/etc/inittab ::shutdown:/etc/rc.d/rc.sysdown#最后一行修改成这样 测试: 服务开机启动 ssh远程登录成功: 以上实验全部完成!!!!!!!!!

优秀的个人博客,低调大师

前Facebook AI翻译主管加盟阿里达摩院,致力图片、视频、声音“秒翻”

日前,前Facebook(脸书)应用机器学习部AI翻译团队主管黄非博士入职阿里巴巴达摩院。 入职后,他将在达摩院机器智能技术实验室,和同事推动AI翻译在新零售、跨境电商、视频等领域的实时翻译应用。 “语言”是跨境交易头号拦路虎。在阿里巴巴国际站,7成买家以英语沟通,还有30%为小语种。而卖家端的调研数据显示,大约96%的卖家对小语种无能为力。 阿里目前需要翻译的商品总量超过4亿。 5月18日,阿里巴巴在跨境电商中正式上线对话实时翻译功能,破解买卖家语言不通难题。据悉,这是全球首个电商领域的实时翻译AI(人工智能)产品。 目前,阿里AI实时翻译日均翻译次数达7.5亿,每年翻译次数超3000亿。公开资料显示,这是全球电商领域AI翻译之最。伴随电商全球化的步伐,阿里AI翻译发展壮大,其AI实时翻译工具目前提供21种热门语言,包括43个语言方向翻

优秀的个人博客,低调大师

SpringBoot2 整合ElasticJob框架,定制化管理流程

一、ElasticJob简介 1、定时任务 在前面的文章中,说过QuartJob这个定时任务,被广泛应用的定时任务标准。但Quartz核心点在于执行定时任务并不是在于关注的业务模式和场景,缺少高度自定义的功能。Quartz能够基于数据库实现任务的高可用,但是不具备分布式并行调度的功能。 2、ElasticJob说明 基础简介 Elastic-Job 是一个开源的分布式调度中间件,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成。Elastic-Job-Lite 为轻量级无中心化解决方案,使用 jar 包提供分布式任务的调度和治理。 Elastic-Job-Cloud 是一个 Mesos Framework,依托于Mesos额外提供资源治理、应用分发以及进程隔离等服务。 功能特点 分布式调度协调 弹性扩容缩容 失效转移 错过执行作业重触发 作业分片一致性,保证同一分片在分布式环境中仅一个执行实例 补刀:人家官网这样描述的,这里赘述一下,充实一下文章。 基础框架结构 该图片来自ElasticJob官网。 由图可知如下内容: 需要Zookeeper组件支持,作为分布式的调度任务,有良好的监听机制,和控制台,下面的案例也就冲这个图解来。 3、分片管理 这个概念在ElasticJob中是最具有特点的,实用性极好。 分片概念 任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。 场景描述:假设有服务3台,分3片管理,要处理数据表100条,那就可以100%3,按照余数0,1,2分散到三台服务上执行,看到这里分库分表的基本逻辑涌上心头,这就是为何很多大牛讲说,编程思维很重要。 个性化参数 个性化参数即shardingItemParameter,可以和分片项匹配对应关系,用于将分片项的数字转换为更加可读的业务代码。 场景描述:这里猛一读好像很飘逸,其实就是这个意思,如果分3片,取名[0,1,2]不好看,或者不好标识,可以分别给个别名标识一下,[0=A,1=B,2=C]。 二、定时任务加载 1、核心依赖包 这里使用2.0+的版本。 <dependency> <groupId>com.dangdang</groupId> <artifactId>elastic-job-lite-core</artifactId> <version>2.1.5</version> </dependency> <dependency> <groupId>com.dangdang</groupId> <artifactId>elastic-job-lite-spring</artifactId> <version>2.1.5</version> </dependency> 2、核心配置文件 这里主要配置一下Zookeeper中间件,分片和分片参数。 zookeeper: server: 127.0.0.1:2181 namespace: es-job job-config: cron: 0/10 * * * * ? shardCount: 1 shardItem: 0=A,1=B,2=C,3=D 3、自定义注解 看了官方的案例,没看到好用的注解,这里只能自己编写一个,基于案例的加载过程和核心API作为参考。 核心配置类: com.dangdang.ddframe.job.lite.config.LiteJobConfiguration 根据自己想如何使用注解的思路,比如我只想注解定时任务名称和Cron表达式这两个功能,其他参数直接统一配置(这里可能是受QuartJob影响太深,可能根本就是想省事...) @Inherited @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface TaskJobSign { @AliasFor("cron") String value() default ""; @AliasFor("value") String cron() default ""; String jobName() default ""; } 4、作业案例 这里打印一些基本参数,对照配置和注解,一目了然。 @Component @TaskJobSign(cron = "0/5 * * * * ?",jobName = "Hello-Job") public class HelloJob implements SimpleJob { private static final Logger LOG = LoggerFactory.getLogger(HelloJob.class.getName()) ; @Override public void execute(ShardingContext shardingContext) { LOG.info("当前线程: "+Thread.currentThread().getId()); LOG.info("任务分片:"+shardingContext.getShardingTotalCount()); LOG.info("当前分片:"+shardingContext.getShardingItem()); LOG.info("分片参数:"+shardingContext.getShardingParameter()); LOG.info("任务参数:"+shardingContext.getJobParameter()); } } 5、加载定时任务 既然自定义注解,那加载过程自然也要自定义一下,读取自定义的注解,配置化,加入容器,然后初始化,等着任务执行就好。 @Configuration public class ElasticJobConfig { @Resource private ApplicationContext applicationContext ; @Resource private ZookeeperRegistryCenter zookeeperRegistryCenter; @Value("${job-config.cron}") private String cron ; @Value("${job-config.shardCount}") private int shardCount ; @Value("${job-config.shardItem}") private String shardItem ; /** * 配置任务监听器 */ @Bean public ElasticJobListener elasticJobListener() { return new TaskJobListener(); } /** * 初始化配置任务 */ @PostConstruct public void initTaskJob() { Map<String, SimpleJob> jobMap = this.applicationContext.getBeansOfType(SimpleJob.class); Iterator iterator = jobMap.entrySet().iterator(); while (iterator.hasNext()) { // 自定义注解管理 Map.Entry<String, SimpleJob> entry = (Map.Entry)iterator.next(); SimpleJob simpleJob = entry.getValue(); TaskJobSign taskJobSign = simpleJob.getClass().getAnnotation(TaskJobSign.class); if (taskJobSign != null){ String cron = taskJobSign.cron() ; String jobName = taskJobSign.jobName() ; // 生成配置 SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration( JobCoreConfiguration.newBuilder(jobName, cron, shardCount) .shardingItemParameters(shardItem).jobParameter(jobName).build(), simpleJob.getClass().getCanonicalName()); LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder( simpleJobConfiguration).overwrite(true).build(); TaskJobListener taskJobListener = new TaskJobListener(); // 初始化任务 SpringJobScheduler jobScheduler = new SpringJobScheduler( simpleJob, zookeeperRegistryCenter, liteJobConfiguration, taskJobListener); jobScheduler.init(); } } } } 絮叨一句:不要疑问这些API是怎么知道,看下官方文档的案例,他们怎么使用这些核心API,这里就是照着写过来,就是多一步自定义注解类的加载过程。当然官方文档大致读一遍还是很有必要的。 补刀一句:如何快速学习一些组件的用法,首先找到官方文档,或者开源库Wiki,再不济ReadMe文档(如果都没有,酌情放弃,另寻其他),熟悉基本功能是否符合自己的需求,如果符合,就看下基本用法案例,熟悉API,最后就是研究自己需要的功能模块,个人经验来看,该过程是弯路最少,坑最少的。 6、任务监听 用法非常简单,实现ElasticJobListener接口。 @Component public class TaskJobListener implements ElasticJobListener { private static final Logger LOG = LoggerFactory.getLogger(TaskJobListener.class); private long beginTime = 0; @Override public void beforeJobExecuted(ShardingContexts shardingContexts) { beginTime = System.currentTimeMillis(); LOG.info(shardingContexts.getJobName()+"===>开始..."); } @Override public void afterJobExecuted(ShardingContexts shardingContexts) { long endTime = System.currentTimeMillis(); LOG.info(shardingContexts.getJobName()+ "===>结束...[耗时:"+(endTime - beginTime)+"]"); } } 絮叨一句:before和after执行前后,中间执行目标方法,标准的AOP切面思想,所以底层水平决定了对上层框架的理解速度,那本《Java编程思想》上的灰尘是不是该擦擦? 三、动态添加 1、作业任务 有部分场景需要动态添加和管理定时任务,基于上面的加载流程,在自定义一些步骤就可以。 @Component public class GetTimeJob implements SimpleJob { private static final Logger LOG = LoggerFactory.getLogger(GetTimeJob.class.getName()) ; private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ; @Override public void execute(ShardingContext shardingContext) { LOG.info("Job Name:"+shardingContext.getJobName()); LOG.info("Local Time:"+format.format(new Date())); } } 2、添加任务服务 这里就动态添加上面的任务。 @Service public class TaskJobService { @Resource private ZookeeperRegistryCenter zookeeperRegistryCenter; public void addTaskJob(final String jobName,final SimpleJob simpleJob, final String cron,final int shardCount,final String shardItem) { // 配置过程 JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder( jobName, cron, shardCount) .shardingItemParameters(shardItem).build(); JobTypeConfiguration jobTypeConfiguration = new SimpleJobConfiguration(jobCoreConfiguration, simpleJob.getClass().getCanonicalName()); LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder( jobTypeConfiguration).overwrite(true).build(); TaskJobListener taskJobListener = new TaskJobListener(); // 加载执行 SpringJobScheduler jobScheduler = new SpringJobScheduler( simpleJob, zookeeperRegistryCenter, liteJobConfiguration, taskJobListener); jobScheduler.init(); } } 补刀一句:这里添加之后,任务就会定时执行,如何停止任务又是一个问题,可以在任务名上做一些配置,比如在数据库生成一条记录[1,job1,state],如果调度到state为停止状态的任务,直接截胡即可。 3、测试接口 @RestController public class TaskJobController { @Resource private TaskJobService taskJobService ; @RequestMapping("/addJob") public String addJob(@RequestParam("cron") String cron,@RequestParam("jobName") String jobName, @RequestParam("shardCount") Integer shardCount, @RequestParam("shardItem") String shardItem) { taskJobService.addTaskJob(jobName, new GetTimeJob(), cron, shardCount, shardItem); return "success"; } } 四、源代码地址 GitHub·地址 https://github.com/cicadasmile/middle-ware-parent GitEE·地址 https://gitee.com/cicadasmile/middle-ware-parent

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册