网站首页 包含标签 Spring 的所有文章

  • docker如何部署xxl-job调度中心

    文章目录 第1步:下载镜像 第2步:创建容器并运行 第3步:浏览器访问 总结 本文主要讲解docker如何部署xxl-job调度中心,我们来一起学习下吧! 如果你还没有安装docker可以参考文章《Docker安装、运行、卸载—Docker学习教程》。 第1步:下载镜像 我们先通过以下指令来下载xxl-job的docker镜像, Docker地址:https://hub.docker.com/r/xuxueli/xxl-job-admin/ (建议指定版本号) docker pull xuxueli/xxl-job-admin 第2步:创建容器并运行 接下来,我们可以通过如下指令创建xxl-job-admin容器并运行: docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:{指定版本} 需要说明的是: 如需自定义 mysql 等配置,可通过 “-e PARAMS” 指定,参数格式 PARAMS=”–key=value –key2=value2″ ; 配置项参考文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties 如需自定义 JVM内存参数 等配置,可通过 “-e JAVA_OPTS” 指定,参数格式 JAVA_OPTS=”-Xmx512m” ; 类似如下指令: docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:{指定版本} 第3步:浏览器访问 最后我们通过浏览器访问地址:http://localhost:8080/xxl-job-admin就可以看到如下界面: 总结 以上就是docker如何部署xxl-job调度中心的全部步骤,希望对你有帮助。...

    2023-11-20 311
  • 如何快速搭建xxl-job项目详解

    文章目录 第1步:下载xxl-job源码 第2步:初始化数据库SQL 第3步:配置部署“调度中心” 3.1:修改调度中心配置文件: 3.2:部署调度中心项目 3.3 调度中心集群(可选): 3.4 其他:Docker 镜像方式搭建调度中心: 第4步: 配置部署“执行器项目” 4.1:部署执行器项目 4.2:测试执行定时任务 总结 本文重点讲解如何快速搭建xxl-job分布式任务调度框架项目,不对xxl-job做深入介绍,如果还不了解该框架的可以移步《xxl-job分布式任务调度框架详解》这篇文章,本文只讲解如何快速搭建xxl-job项目相关的实操步骤,我们一起来看以下。 搭建xxl-job项目xxl-job主要分为4个步骤: 第1步:下载xxl-job源码 首先我们去github或者gitee去下载xxl-job的项目源码,这里我下载2.4.0的版本。以下是下载地址: github:https://github.com/xuxueli/xxl-job gitee:https://gitee.com/xuxueli0323/xxl-job xxl-job官方教程文档:https://www.xuxueli.com/xxl-job/ 下载时选择自己想要的版本,建议是稳定版。 第2步:初始化数据库SQL 接下来,我们需要初始化“调度数据库”,请将下载好的项目源码解压,获取 “调度数据库初始化SQL脚本” 并执行即可,SQL脚本位置在如下: /xxl-job/doc/db/tables_xxl_job.sql 注意: 1)该SQL脚本是mysql数据库脚本,会自动创建名为xxl_job的数据库,表名也都是xxl_job开头的,如果你要修改数据库名称,记得提前改下脚本,初始化后一共8张表如下: 2)另外,调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例,如果mysql做主从,调度中心集群节点务必强制走主库。 第3步:配置部署“调度中心” 接下来我们需要配置部署“调度中心”,调度中心的作用是统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。其实就是我们可视化的后台管理项目,即调度中心项目:xxl-job-admin。 因此,我们需要将源码中xxl-job-admin项目导入IDEA,由于是maven开发的,因此你本地需要配置好maven环境,没配置过的请参考《IntelliJ IDEA如何整合Maven图文教程详解》。 3.1:修改调度中心配置文件: 调度中心配置文件地址: /xxl-job-admin/src/main/resources/application.properties 调度中心配置内容说明: ### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root_pwd spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ### 报警邮箱 spring.mail.host=smtp.qq.com spring.mail.port=25 spring.mail.username=xxx@qq.com spring.mail.password=xxx spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory ### 调度中心通讯TOKEN [选填]:非空时启用; xxl.job.accessToken= ### 调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体, 可选范围为 "zh_CN"/中文简体, "zh_TC"/中文繁体 and "en"/英文; xxl.job.i18n=zh_CN ## 调度线程池最大线程配置【必填】 xxl.job.triggerpool.fast.max=200 xxl.job.triggerpool.slow.max=100 ### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能; xxl.job.logretentiondays=30 以上配置重点关注jdbc数据库连接相关的内容,比如修改数据库用户名密码,以及报警邮箱相关配置,这里就不再详细展开,大家根据自己的需求配置修改即可。 3.2:部署调度中心项目 在idea中可以直接启动运行该项目,如果已经正确进行上述配置,运行成功会打印如下日志: 10:13:54.594 logback [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path '/xxl-job-admin' 10:13:54.606 logback [main] INFO c.x.job.admin.XxlJobAdminApplication - Started XxlJobAdminApplication in 2.167 seconds (JVM running for 3.881) 10:13:59.003 logback [xxl-job, admin JobScheduleHelper#scheduleThread] INFO c.x.j.a.c.thread.JobScheduleHelper - >>>>>>>>> init xxl-job admin scheduler success. 然后浏览器访问调度中心访问地址:http://localhost:8080/xxl-job-admin(该地址执行器将会使用到,作为回调地址) 默认登录账号 “admin/123456”, 登录后运行界面如下图所示。 如果要上线部署,可将项目编译打包部署即可。以上,我们就将任务调度中心集成好了。 另外补充说明以下两点: 3.3 调度中心集群(可选): 调度中心支持集群部署,提升调度系统容灾和可用性。 调度中心集群部署时,几点要求和建议: DB配置保持一致; 集群机器时钟保持一致(单机集群忽视); 建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。 3.4 其他:Docker 镜像方式搭建调度中心: 参考文章《docker如何部署xxl-job调度中心》 第4步: 配置部署“执行器项目” “执行器”项目其实就是我们下载源码中的:xxl-job-executor-samples项目,这里面有两个“执行器”项目,分别为xxl-job-executor-sample-frameless和xxl-job-executor-sample-springboot。 xxl-job提供2种版本执行器供选择,现以 springboot 版本为例,可直接使用,也可以参考其并将现有项目改造成执行器。 顺便说下执行器项目作用:负责接收“调度中心”的调度并执行;可直接部署执行器,也可以将执行器集成到现有业务项目中。 4.1:部署执行器项目 我们使用idea打开xxl-job-executor-samples项目,注意application.properties中xxl.job.admin.addresses配置,调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行”执行器心跳注册”和”任务结果回调”;为空则关闭自动注册;我们这里默认和之前调度中心地址一致即可。 xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin 然后直接运行xxl-job-executor-springboot项目,发现启动成功。 4.2:测试执行定时任务 接下来,我们测试执行系统默认定时任务,打开调度中心页面,在任务管理中,执行一次,如下图: 我们发现在xxl-job-executor-springboot项目中,打印了如下信息: 10:43:54.772 logback [Thread-8] INFO com.xxl.job.core.server.EmbedServer - >>>>>>>>>>> xxl-job remoting server start success, nettype = class com.xxl.job.core.server.EmbedServer, port = 9999 10:47:23.505 logback [xxl-job, EmbedServer bizThreadPool-303137862] INFO c.x.job.core.executor.XxlJobExecutor - >>>>>>>>>>> xxl-job regist JobThread success, jobId:1, handler:com.xxl.job.core.handler.impl.MethodJobHandler@344426bf[class com.xxl.job.executor.service.jobhandler.SampleXxlJob#demoJobHandler] 10:49:06.782 logback [xxl-job, JobThread-1-1700189243505] INFO com.xxl.job.core.thread.JobThread - >>>>>>>>>>> xxl-job JobThread stoped, hashCode:Thread[xxl-job, JobThread-1-1700189243505,10,main] 查看调度日志查看发现调度成功: 总结 当然你也可以将下载的整个项目源码导入idea,分别修改配置,然后运行以上的两个子项目,就可以进行搭建测试了。 如果你想将调度执行项目集成到自己的springboot项目中该如何去实现呢?具体的请参考文章《SpringBoot如何集成整合xxl-job任务调度框架》。 以上就是快速搭建搭建xxl-job项目详解的全部内容,希望对你有帮助。 ...

    2023-11-20 256
  • Java 字符串常量池

    文章目录 1.Java中的不可变字符串 2.Java中的String常量池是什么? 3.字符串文字和字符串对象的区别 4.String.intern() API 5.优点 5.1. 增强的安全性 5.2. 线程安全性 6.缺点 6.1. 无法扩展String类 6.2. 长时间内存中的敏感数据 6.3. 可能的OutOfMemoryError 了解Java中的String类,创建它的不可变性背后的动机,以及String常量池的概念。我们将看到当我们通过String文字或String构造函数创建String实例时,内存是如何被操作的。最后,我们将讨论String类的不可变性引起的主要优点和缺点。 1.Java中的不可变字符串 字符串是字符序列。在Java中,与其他编程语言类似,字符串是预定义类型的一部分。Java有java.lang.String类,其实例表示字符串。 String类是一个不可变类。不可变意味着一旦创建了String实例,就无法更改它。 通常,许多敏感信息(用户名、密码、URL、端口、数据库、套接字连接)被表示并传递为字符串。通过使这些信息不可变,代码就能够免受各种安全威胁的影响。 字符串的不可变性还允许缓存字符串文字,这允许应用程序在堆内存和垃圾收集器上产生最小的影响的情况下使用大量的字符串文字。 在可变的上下文中,修改字符串文字可能导致变量损坏。 2.Java中的String常量池是什么? 在Java中,内存被分为三个部分,即堆、栈和字符串池。字符串常量池是用于存储字符串文字的特殊区域。 请注意,在Java 7之前,字符串池是永久代内存区的一部分。 从Java 7开始,字符串与应用程序创建的其他对象一起分配在Java堆区域中。 随后,在Java 8中,永久代已完全删除。 因此,在最新的JVM中,字符串池是堆内存中的一个特殊区域,用于存储字符串文字。 尽管字符串池已从永久代空间移动到堆内存区域,但围绕字符串的创建、文字、对象和内部化的所有概念都没有改变。   3.字符串文字和字符串对象的区别 在Java中,字符串文字是使用双引号创建的字符串,而字符串对象是使用new()运算符创建的字符串。 需要注意的是,字符串文字是在字符串池区域创建的,而字符串对象是在堆内存区域创建的。 String strLiteral = "Hello World"; String strObj = new String("Hello World"); 假设我们想创建两个具有相同内容“panziye.com”的字符串。如果已经存在一个内容为“panziye.com”的字符串,那么新的文字将指向已经存在的文字。而对于字符串对象,每次都会在堆内存中创建一个新的字符串对象。 让我们看一个示例: String a = "panziye.com"; String b = "panziye.com"; System.out.println(a == b); //true 在上面的程序中,我们创建了两个具有相同内容的字符串文字。在字符串池中创建了’a’之后,下一个字符串文字’b’指向了内存中的同一个对象,所以’a == b’是true。这是因为Java中的字符串文字会被重用,以节省内存空间。 String a = "panziye.com"; String b = "panziye.com"; System.out.println(a == b); String c = new String("panziye.com"); System.out.println(a == b); //true System.out.println(b == c); //false 在上面的程序中,我们创建了一个具有类似内容的新字符串对象。当我们检查对象引用是否相等时,我们看到’b’和’c’指向不同的对象。这意味着当我们创建字符串对象’c’时,在内存中创建了一个新的对象。这是因为每次使用new关键字创建字符串对象时,都会在堆内存中分配一个新的对象。这与字符串文字不同,字符串文字在字符串池中被重用。 4.String.intern() API 我们知道字符串文字是在字符串池中创建的,而字符串对象是在堆内存区域中创建的。 我们可以使用String.intern()方法为字符串对象创建字符串文字。当在字符串对象上调用intern()方法时,它会在堆内存中创建一个String对象的精确副本,并将其存储在字符串常量池中。 String a = "panziye"; String b = "panziye"; String c = new String("panziye"); String d = c.intern(); 在上面的例子中,字符串a、b和d将引用SCP中相同的字符串文字。而字符串c将继续指向堆内的对象。 5.优点 5.1. 增强的安全性 正如前面所述,字符串池允许字符串不可变。不可变对象有助于使应用程序更安全,因为它们可能存储敏感信息。 由于我们无法更改不可变对象,这有助于提高安全性。 5.2. 线程安全性 字符串可能是Java应用程序中最常用的对象。想象一下,如果字符串是可变的。在这种情况下,在应用程序中管理线程安全将会成为一场噩梦。 任何不可变对象都具有天生的线程安全性。这意味着多个线程可以共享和操作字符串,而无需担心损坏和不一致性。 6.缺点 6.1. 无法扩展String类 如果我们想扩展String类以添加更多功能,那是不可能的。不可变类被声明为final以防止扩展。 但幸运的是,我们有许多第三方库(如Apache Commons Lang、Spring Framework、Guava),它们为几乎所有种类的用途提供了出色的实用程序类。 6.2. 长时间内存中的敏感数据 字符串中的敏感数据(例如密码)可能会在内存中(在字符串常量池中)驻留更长时间,因为字符串常量池受到垃圾收集器的特殊处理。垃圾收集器不会像访问其他内存区域那样频繁(周期性)访问字符串常量池。 由于这种特殊处理,敏感数据会在字符串常量池中保存很长时间,可能会容易受到不希望的使用。 为了避免这种潜在的缺点,建议将敏感数据(例如密码)存储在char[]中,而不是String中。 6.3. 可能的OutOfMemoryError 字符串常量池与其他内存区域相比是一个小内存区域,可能会很快填满。将太多字符串文字存储在字符串常量池中会导致OutOfMemoryError。 ...

    2023-09-16 187

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注