jetty嵌入式开发及spring整合quartz(内存模式)

1 依赖jar包

在这里插入图片描述

2 jetty嵌入式开发

2.1 jetty服务启动类

package com.primal.server;import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;/*** Author whh* Date 2023/10/12/ 21:58* <p></p>*/
public class ServerImpl {public static void main(String[] args) throws Exception {Server server = new Server(8888);//servlet服务ServletHandler servletHandler = new ServletHandler(){{addServletWithMapping(new ServletHolder(new HttpServlet() {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html; charset=utf-8");resp.setStatus(HttpServletResponse.SC_OK);PrintWriter out = resp.getWriter();out.println("<h1>" + "hello" + "</h1>");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}}),"/hello");}};//文件服务ResourceHandler resourceHandler = new ResourceHandler() {{setDirectoriesListed(true);setWelcomeFiles(new String[]{"index.html"});setResourceBase(".");}};HandlerList handlers = new HandlerList();handlers.setHandlers(new Handler[] { resourceHandler, servletHandler });server.setHandler(handlers);server.start();server.join();}
}

jetty文件服务器效果

在这里插入图片描述

jetty内嵌servlet服务效果

在这里插入图片描述

3 spring整合quartz

3.1 quartz.properties配置文件

# 调度器实例名称
org.quartz.scheduler.instanceName = quartz-scheduler-ram
# 定时任务信息存储方式: 内存
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
# 定时任务线程数
org.quartz.threadPool.threadCount = 3

3.2 spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--告知spring在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中,而是一个名称为context名称空间和约束中--><context:component-scan base-package="com"/>
</beans>

3.3 quartz配置

package com.primal.quartz.config;import org.quartz.Trigger;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;/*** Author whh* Date 2023/10/11/ 21:44* <p></p>*/
@ImportResource(value = {
//将任务触发器加入到spring容器中"classpath:configJobs/*ApplicationContext.xml"
})
@Configuration
public class QuartzConfig {@Beanpublic SchedulerFactoryBean schedulerFactoryBean(AutowireCapableBeanFactory capableBeanFactory,ApplicationContext ctx){SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();schedulerFactoryBean.setConfigLocation(new ClassPathResource("quartz.properties"));schedulerFactoryBean.setJobFactory(new AdaptableJobFactory(){@Overrideprotected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {Object jobInstance = super.createJobInstance(bundle);capableBeanFactory.autowireBean(jobInstance);return jobInstance;}});//设置触发器schedulerFactoryBean.setTriggers(ctx.getBeansOfType(CronTriggerFactoryBean.class).values().stream().map(CronTriggerFactoryBean::getObject).toArray(Trigger[]::new));schedulerFactoryBean.setAutoStartup(true);return schedulerFactoryBean;}
}

3.3 job父类用于增强子类

package com.primal.quartz.support;import com.primal.util.AsyncManager;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;/*** Author whh* Date 2023/10/11/ 19:56* <p></p>*/
public abstract class JobSupport implements Job {//用于子类实现具体任务需求public abstract void doExecute(JobExecutionContext jobExecutionContext);@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {doExecute(jobExecutionContext);//异步记录日志AsyncManager.me().setDelay(1).submit(() -> {System.out.println("记录日志:"+Thread.currentThread().getName());});}
}

3.4 异步线程池工具类

package com.primal.util;import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;/*** Author whh* Date 2023/10/11/ 19:59* <p></p>*/
public class AsyncManager {//延时执行时间private long delay = 10;private ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10,new DefaultThreadFactory());private static final AsyncManager me = new AsyncManager();private AsyncManager(){}public static AsyncManager me(){return me;}/*** 提交任务* @param task*/public void submit(Runnable task){this.executor.schedule(task,delay, TimeUnit.SECONDS);}/*** 设置任务延时执行时间 单位秒* @param delay* @return*/public AsyncManager setDelay(long delay) {this.delay = delay;return this;}/*** 停止线程池*/public void shutdown(){this.executor.shutdown();}/*** 线程池工厂*/private static class DefaultThreadFactory implements ThreadFactory{private static final AtomicInteger poolNumber = new AtomicInteger(1);private final ThreadGroup group;private final AtomicInteger threadNumber = new AtomicInteger(1);private final String namePrefix;DefaultThreadFactory() {SecurityManager s = System.getSecurityManager();group = (s != null) ? s.getThreadGroup() :Thread.currentThread().getThreadGroup();namePrefix = "pool-" +poolNumber.getAndIncrement() +"-thread-";}@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(group, r,namePrefix + threadNumber.getAndIncrement(),0);if (t.isDaemon())t.setDaemon(false);if (t.getPriority() != Thread.NORM_PRIORITY)t.setPriority(Thread.NORM_PRIORITY);return t;}}}

3.5 业务job子类

package com.primal.job;import com.primal.bean.Person;
import com.primal.quartz.support.JobSupport;
import org.quartz.JobExecutionContext;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;public class TestJob extends JobSupport {@AutowiredPerson person;@AutowiredScheduler scheduler;@Overridepublic void doExecute(JobExecutionContext jobExecutionContext) {System.out.println("Hello world..."+person);System.out.println("TestJob:"+scheduler);System.out.println("TestJob:"+Thread.currentThread().getName());}
}

3.6 业务job子类对应的xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--自定义job任务--><bean id="TestJob" class="com.primal.job.TestJob"/><!--job任务纳管到JobDetailFactoryBean类中--><bean id="TestJobName" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="description" value="TestJob测试"/><property name="group" value="TestJobGroup"/><property name="jobClass" value="com.primal.job.TestJob"/><property name="durability" value="true"/><property name="jobDataAsMap"><map><entry key="JobName" value="TestJob"/><entry key="RepeatTime" value="0"/><entry key="RepeatInterval" value="10"/></map></property></bean>
<!--将JobDetailFactoryBean配置到CronTriggerFactoryBean中,并指定cron表达式--><bean id="TestJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="TestJobName"/><property name="cronExpression" value="*/3 * * * * ?"/><!--错过是否补跑 0,1是 2 否--><property name="misfireInstruction" value="2"/></bean></beans>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/133111.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将人工智能应用于 API 安全

如今&#xff0c;在安全行业中&#xff0c;几乎每个地方都会提到人工智能 (AI) 的话题。确实&#xff0c;人工智能是一个热门话题。像许多热门话题一样&#xff0c;围绕它有相当多的嗡嗡声和炒作。突然间&#xff0c;你遇到的每个人似乎都在大力利用人工智能。 正如你可以想象…

使用【Blob、Base64】两种方式显示【文本、图片、视频】 使用 video 组件播放视频

Blob 显示 Blob 对象的类型是由 MIME 类型&#xff08;Multipurpose Internet Mail Extensions&#xff09;来确定的。MIME 类型是一种标准&#xff0c;用于表示文档、图像、音频、视频等多媒体文件的类型。以下是一些常见的 Blob 对象类型&#xff1a; text/plain&#xff1…

LLM应用架构 LLM application architectures

在本课程的最后一部分&#xff0c;您将探讨构建基于LLM的应用程序的一些额外考虑因素。首先&#xff0c;让我们把迄今为止在本课程中所见的一切汇总起来&#xff0c;看看创建LLM驱动应用程序的基本组成部分。您需要几个关键组件来创建端到端的应用程序解决方案&#xff0c;从基…

时代风口中的Web3.0基建平台,重新定义Web3.0!

近年来&#xff0c;Web3.0概念的广泛兴起&#xff0c;给加密行业带来了崭新的叙事方式&#xff0c;同时也为加密行业提供了更加具有想象力的应用场景与商业空间&#xff0c;并让越来越多的行业从业者们意识到只有更大众化的市场共性需求才能推动加密市场的持续繁荣。当前围绕这…

idea 启动出现 Failed to create JVM JVM Path

错误 idea 启动出现如下图情况 Error launching IDEA If you already a 64-bit JDK installed, define a JAVA_HOME variable in Computer > System Properties> System Settings > Environment Vanables. Failed to create JVM. JVM Path: D:\Program Files\JetB…

智慧空开让用电更安全、管理更智能——电脑APP远程控制开合闸

安科瑞 崔丽洁 01 什么是低压断路器&#xff1f;低压断路器的定义是&#xff1a;能够接通、承载及分断正常电路条件下的电流&#xff0c;也能在规定的非正常电路条件&#xff08;过载、短路、特别是短路&#xff09;下接通、承载一定时间和分断电流的开关电器。 断路器的分类&…

SwinTransformer学习记录(一)之整体架构

SwinTransformer自问世以来&#xff0c;凭借其优秀的性能&#xff0c;受到无数研究者的青睐&#xff0c;因此作为一个通用的骨干网络&#xff0c;其再目标检测&#xff0c;语义分割&#xff0c;去噪等领域大杀四方&#xff0c;可谓是风光无限&#xff0c;今天&#xff0c;我们便…

高级深入--day30

Scrapy Shell Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据。 如果安装了 IPython ,Scrapy终端将使用 IPython (替代标准Python终端)。 IPython 终端与其…

v-model绑定input、textarea、checkbox、radio、select

1.input <div><!-- v-model绑定input --><input type"text" v-model"message"><h2>{{message}}</h2></div><script>const App{template:#my-app,data() {return {message:Hello World,}},}Vue.createApp(App).…

【大数据】HDFS概述(学习笔记)

一、文件系统、分布式文件系统 1、传统文件系统 文件系统是一种存储和组织数据的方法&#xff0c;实现了数据的存储、分级组织、访问和获取等操作。 文件系统使用树形目录的抽象逻辑概念代替了硬盘等物理设备使用数据块的概念。 数据&#xff1a;指存储的内容本身。这些数据…

what?es数据偏移了8小时...

今天搞监控大屏的时候&#xff0c;测试突然提出一个问题说&#xff0c;查一段时间的数据&#xff0c;时间曲线返回的日期有时候会比查询时间多&#xff0c;翻看代码后&#xff0c;初步定位为es的时区问题&#xff0c;后来将时间曲线的直方图聚合增加时区后&#xff0c;返回数据…

H3C交换机的40G堆叠线 ,可以插在普通光口做堆叠吗?

环境&#xff1a; S6520X-24ST-SI交换机 H3C LSWM1QSTK2万兆40G堆叠线QSFP 问题描述&#xff1a; H3C交换机的40G堆叠线 &#xff0c;可以插在普通光口做堆叠吗&#xff1f; 解答&#xff1a; 1.H3C交换机的40G堆叠线通常是用于连接堆叠模块或堆叠端口的。这些堆叠线通常使…