spring定时任务执行两次及tomcat部署缓慢问题的解决方法
作者:Fururur 发布时间:2022-12-27 09:53:25
一、spring定时任务执行两次
问题重现和解析
最近使用quartz定时任务框架,结果发现开发环境执行无任何问题,部署到服务器上后,发现同一时间任务执行了多次。经过搜索发现是服务器上tomcat的配置文件出现了问题。
原来的配置文件——server.xml如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="www.xxx.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/usr/local/tomcat/apache-tomcat-8.5.9/webapps/xxxindex" reloadable="true"></Context>
</Host>
一个Host表示一个容器,里面可以包含若干个Context(应用)。上面这段配置文件意思就是:在tomcat中配置了两个容器,一个name=localhost,应用的根目录为webapps,并且会自动解压war包和自动部署。没有指定context,会把根目录下的所有web应用都部署,部署成功后,外网可以通过服务器IP+项目名来访问;另一个name=www.xxx.com,和第一个host不同在于,配置了主页web应用,且不需要跟项目名就可以访问。部署成功后可以通过域名+项目名访问,主页所在项目可以直接通过根域名访问。
这个时候问题就来了,包含定时任务的项目部署在webapps目录下,tomcat中两个独立的容器都部署了一遍,相当于项目在服务器上的tomcat上部署了两次,两边同时会运行定时任务,指定的是同一个数据库。
问题解决
因此,为了尽可能不影响其他项目的正常访问,我做了折中,讲需要执行定时任务的项目单独部署在另一个文件夹中,例如webroot ,然后只使用域名那个host,配置文件修改后如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="www.xxx.com" appBase="" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/usr/local/tomcat/apache-tomcat-8.5.9/webapps/xxxindex" reloadable="true"></Context>
<Context path="/projectA" docBase="/usr/local/tomcat/apache-tomcat-8.5.9/webapps/projectA" reloadable="true"></Context>
<Context path="/projectB" docBase="/usr/local/tomcat/apache-tomcat-8.5.9/webapps/projectB" reloadable="true"></Context>
<Context path="/projectC" docBase="/usr/local/tomcat/apache-tomcat-8.5.9/webroot/projectC" reloadable="true"></Context>
</Host>
可以看到projectC是包含定时任务的项目。这样部署成功后,除了该项目只能通过域名访问之外,其余项目的访问方式和之前保持不变。同时问题解决,定时任务只执行一次。
网上的另一种说法
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context docBase="projectA" path="" reloadable="true" />
</Host>
只有一个host,tomcat在启动时,会部署一次根目录下的所有项目,然后Context又会单独部署一次,所以也会导致定时任务执行2次。
对于这种问题,解决的方案也有多种:
将huost的appBase设为空,将Context的Context 指向项目部署位置的绝对路径。
删除Context节点。
二、tomcat部署缓慢的问题
用的阿里云服务器,部署tomcat时速度非常慢,但是后来买的新阿里云又没有这个问题。部署项目后一直会在
INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /opt/apache-tomcat-8.0.15-server/webapps/ROOT
这里卡好几分钟才会继续下去。之前一直以为是服务器配置原因,后来无意中发现是jre的配置原因。参考了几篇博客,发现oracle在WebLogic的文档下Avoiding JVM Delays Caused by Random Number Generation给了原因和解决方案。
The library used for random number generation in Sun's JVM relies on /dev/random by default for UNIX platforms. This can potentially block the WebLogic SIP Server process because on some operating systems /dev/random waits for a certain amount of "noise" to be generated on the host machine before returning a result. Although /dev/random is more secure, BEA recommends using /dev/urandom if the default JVM configuration delays WebLogic SIP Server startup.
意思就是:
JVM上产生随机数的策略有两种:/dev/random 和/dev/urandom。
tomcat或者WebLogic等web服务器在部署时需要等待若一段随机数产生的时间。unix平台下JVM默认采用的是安全性更好的/dev/random,但是潜在的会阻塞服务进程。
推荐使用/dev/urandom,产生随机数速度快,/dev/random需要时间间隔生成随机数,部署时间长。
修改方式:
打开$JAVA_HOME/jre/lib/security/java.security文件。
将securerandom.source=file:/dev/random 修改为securerandom.source=file:/dev/urandom
重启tomcat,三十秒部署成功,solve it
来源:https://www.cnblogs.com/Sinte-Beuve/p/8360321.html
猜你喜欢
- 本文中我们会讲解如何在Spring Boot JPA中实现class和数据表格的映射。默认实现Spring Boot JPA底层是用Hibe
- 需求背景接到这样一个需求,需要在 WebView 的所有网络请求中,在请求的url中,加上一个xxx=1的标志位。例如 http:
- XML中的扫描过程<?xml version="1.0" encoding="utf-8" ?
- 建库建表DROP DATABASE IF EXISTS mp;CREATE DATABASE mp DEFAULT CHARACTER SE
- 下面是android SDK中API中的主要java包的功能简介: android.app :提供高层的程序模型、提供基本的运行环
- 面试题1:Bean 的加载过程是怎样的?我们知道, Spring 的工作流主要包括以下两个环节:解析,读 xml 配置,扫描类文件,从配置或
- 本文实例为大家分享了MapReduce实现决策树算法的具体代码,供大家参考,具体内容如下首先,基于C45决策树算法实现对应的Mapper算子
- 委托:委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(Delegate)特别用于实现事件和回
- 本文实例为大家分享了Unity动画混合树实例代码,供大家参考,具体内容如下先看效果游戏动画中的一项常见任务是在两个或更多相似运动之间进行混合
- 前言easyui是一种基于jQuery的用户界面插件集合。easyui为创建现代化,互动,JavaScript应用程序,提供必要的功能。使用
- 前言可能对于很多新人来讲,看到这个题目,想到的能接收输入法输入的内容大概只有EditText和TextView这两个控件了,其实不然,只要是
- 什么是Socket? 所谓Socket通常也称作“套接字”,用于描述IP地址和端口
- 公钥与私钥公钥与私钥是成对的,一般的,我们认为的是公钥加密、私钥解密、私钥签名、公钥验证,有人说成私钥加密,公钥解密时不对的。公钥与私钥的生
- 如下所示本来 bookService的引用一直是null。导致每次测试都报空指针异常。然后现在继承相应的 ApplicationTests类
- 目录前言一、Android应用DAC沙盒二、Android应用权限三、应用信息的存储四、应用权限的映射五、应用的SELinux标签六、And
- 前言内存治理一直是每个开发者最关心的问题,我们在日常开发中会遇到各种各样的内存问题,比如OOM,内存泄露,内存抖动等等,这些问题都有以下共性
- 前言最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯
- GitHub有一个开源控件PickerView,可以实现 * 联动的效果。虽然该控件使用非常简单,但是填充数据异常繁琐。GitHub上的Dem
- 这三种锁是指锁的状态,并且是专门针对Synchronized关键字。JDK 1.6 为了减少"重量级锁"的性能消耗,引入
- 一、系统启动后注入配置package com.example.config;import org.springframework.beans