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 ;
public class ServerImpl { public static void main ( String [ ] args) throws Exception { Server server = new Server ( 8888 ) ; ServletHandler servletHandler = new ServletHandler ( ) { { addServletWithMapping ( new ServletHolder ( new HttpServlet ( ) { @Override protected 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>" ) ; } @Override protected 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" > < 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 ;
@ImportResource ( value = {
"classpath:configJobs/*ApplicationContext.xml"
} )
@Configuration
public class QuartzConfig { @Bean public SchedulerFactoryBean schedulerFactoryBean ( AutowireCapableBeanFactory capableBeanFactory, ApplicationContext ctx) { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean ( ) ; schedulerFactoryBean. setConfigLocation ( new ClassPathResource ( "quartz.properties" ) ) ; schedulerFactoryBean. setJobFactory ( new AdaptableJobFactory ( ) { @Override protected 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 ;
public abstract class JobSupport implements Job { public abstract void doExecute ( JobExecutionContext jobExecutionContext) ; @Override public 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 ;
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; } public void submit ( Runnable task) { this . executor. schedule ( task, delay, TimeUnit . SECONDS ) ; } 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-" ; } @Override public 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 { @Autowired Person person; @Autowired Scheduler scheduler; @Override public 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" > < bean id = " TestJob" class = " com.primal.job.TestJob" /> < 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>
< bean id = " TestJobTrigger" class = " org.springframework.scheduling.quartz.CronTriggerFactoryBean" > < property name = " jobDetail" ref = " TestJobName" /> < property name = " cronExpression" value = " */3 * * * * ?" /> < property name = " misfireInstruction" value = " 2" /> </ bean> </ beans>