❶ spring boot比较当前时间大于过去时间
方法如下:
在任意写的一个main方法中,使用:LocalDateTimenow=LocalDateTime.now(),获取到的当前时间都是正确的,但是在springboot启动后,任意一个方法中使用上述获取当前时间都是比当前系统时间早8个小时。
❷ SpringBoot 定时任务cron
首先在启动类中加上注解 @EnableScheling
二、
"0/5 * * * * ?"代表每隔五秒执行一次。
cron一共有7位,最后一位是年,可以留空,所以我们可以写6位:
第一位,表示秒,取值0-59
第二位,表示分,取值0-59
第三位,表示小时,取值0-23
第四位,表示日,取值1-31
第五位,表示月份,取值1-12
第六位,表示星期/周,取值1-7,1表示星期天,2表示星期一。
第7为,表示年份,可以留空,取值1970-2099
其中最难理解的就是那些符号了,下面每个符号举个栗子:
, :表示列出枚举值,例如在第二位使用5,35,表示在分钟数为5、35时执行。
- :表示范围,例如在第二位使用5-35,表示在分钟数为5到35时每分钟都执行。
* :表示匹配该域的任意值。例如在第二位使用 * 表示分钟数不做限制,每分钟都会执行。
/ :表示起始时间开始执行,然后每隔固定时间执行一次。例如在第二位使用5/6,表示在分钟数为5时执行一次,然后隔6分钟执行一次,也就是在11、17分钟再分别执行。
? :只能用在第四位(日)和第六位(星期)两个域,因为这两个域互斥,必须对其一设置?。
L :表示最后。只能用在第四位(日)和第六位(星期)两个域,如果在第六位使用5L,意味着在最后的一个星期四执行。
W :表示有效工作日(周一到周五),只能出现在第四位(日)域。系统将在离指定日期最近的有效工作日出发事件。如15W,表示最接近15号的工作日,可能是15号(刚好是工作日)那就在15号执行。15号如果不是工作日,是星期天,那就往后推,在16号执行。16号是最接近工作日的日期。
LW :表示某个月最后一个工作日。
# :用于确定每个月第几个星期几,只能出现在第六位(星期)域,例如4#3,表示某月的第3个星期三。
C ::只能用在第四位(日)和第六位(星期)两个域,需要关联日历,如果没关联可以忽略。
专有符号中除?外,在spirng定时任务中都 不支持 .
测试
项目启动的时候就会出现异常
那在哪里能使用呢??
Quartz 支持。
在线Cron表达式生成器 可以去测试一下.
定时任务默认是单线程的,如果认为持续时间较长,就会将后面的定时任务拖延,导致丢失任务。
测试:
可以看出这两个定时任务都是一个线程在执行,如果有一个定时任务执行比较耗时(比如:configureTasks模拟耗时,开启线程睡眠),就会造成任务丢失。
启动类上加上注解
❸ 教你如何在Spring Boot中使用RSocket
RSocket应用层协议支持 Reactive Streams语义, 例如:用RSocket作为HTTP的一种替代方案。在本教程中, 我们将看到RSocket用在spring boot中,特别是spring boot 如何帮助抽象出更低级别的RSocket API。
让我们从添加spring-boot-starter-rsocket依赖开始:
这个依赖会传递性的拉取RSocket相关的依赖,比如:rsocket-core 和 rsocket-transport-netty
现在继续我们的简单应用程序。为了突出RSocket提供的交互模式,我打算创建一个交易应用程序, 交易应用程序包括客户端和服务器。
3.1. 服务器设置
首先,我们设置由springboot应用程序引导的RSocket server服务器。 因为有spring-boot-starter-rsocket dependency依赖,所以springboot会自动配置RSocket server。 跟平常一样, 可以用属性驱动的方式修改RSocket server默认配置值。例如:通过增加如下配置在application.properties中,来修改RSocket端口
也可以根据需要进一步修改服务器的其他属性
3.2.设置客户端
接下来,我们来设置客户端,也是一个springboot应用程序。虽然springboot自动配置大部分RSocket相关的组件,但还要自定义一些对象来完成设置。
这儿我们正在创建RSocket客户端并且配置TCP端口为:7000。注意: 该服务端口我们在前面已经配置过。 接下来我们定义了一个RSocket的装饰器对象RSocketRequester。 这个对象在我们跟RSocket server交互时会为我们提供帮助。 定义这些对象配置后,我们还只是有了一个骨架。在接下来,我们将暴露不同的交互模式, 并看看springboot在这个地方提供帮助的。
我们从Request/Response开始,HTTP也使用这种通信方式,这也是最常见的、最相似的交互模式。 在这种交互模式里, 由客户端初始化通信并发送一个请求。之后,服务器端执行操作并返回一个响应给客户端--这时通信完成。 在我们的交易应用程序里, 一个客户端询问一个给定的股票的当前的市场数据。 作为回复,服务器会传递请求的数据。
4.1.服务器
在服务器这边,我们首先应该创建一个controller 来持有我们的处理器方法。 我们会使用 @MessageMapping注解来代替像SpringMVC中的@RequestMapping或者@GetMapping注解
来研究下我们的控制器。 我们将使用@Controller注解来定义一个控制器来处理进入RSocket的请求。 另外,注解@MessageMapping让我们定义我们感兴趣的路由和如何响应一个请求。 在这个示例中, 服务器监听路由currentMarketData, 并响应一个单一的结果Mono<MarketData>给客户端。
4.2. 客户端
接下来, 我们的RSocket客户端应该询问一只股票的价格并得到一个单一的响应。 为了初始化请求, 我们该使用RSocketRequester类,如下:
注意:在示例中,RSocket客户端也是一个REST风格的controller,以此来访问我们的RSocket服务器。因此,我们使用@RestController和@GetMapping注解来定义我们的请求/响应端点。 在端点方法中, 我们使用的是类RSocketRequester并指定了路由。 事实上,这个是服务器端RSocket所期望的路由,然后我们传递请求数据。最后,当调用retrieveMono()方法时,springboot会帮我们初始化一个请求/响应交互。
接下来我们将查看 Fire And Forget交互模式。正如名字提示的一样,客户端发送一个请求给服务器,但是不期望服务器的返回响应回来。 在我们的交易程序中, 一些客户端会作为数据资源服务,并且推送市场数据给服务器端。
5.1.服务器端
我们来创建另外一个端点在我们的服务器应用程序中,如下:
我们又一次定义了一个新的@MessageMapping路由为collectMarketData。此外, Spring Boot自动转换传入的负载为一个MarketData实例。 但是,这儿最大的不同是我们返回一个Mono<Void>,因为客户端不需要服务器的返回。
5.2. 客户端
来看看我们如何初始化我们的fire-and-forget模式的请求。 我们将创建另外一个REST风格的端点,如下:
这儿我们指定路由和负载将是一个MarketData实例。 由于我们使用send()方法来代替retrieveMono(),所有交互模式变成了fire-and-forget模式。
请求流是一种更复杂的交互模式, 这个模式中客户端发送一个请求,但是在一段时间内从服务器端获取到多个响应。 为了模拟这种交互模式, 客户端会询问给定股票的所有市场数据。
6.1.服务器端
我们从服务器端开始。 我们将添加另外一个消息映射方法,如下:
正如所见, 这个处理器方法跟其他的处理器方法非常类似。 不同的部分是我们返回一个Flux<MarketData>来代替Mono<MarketData>。 最后我们的RSocket服务器会返回多个响应给客户端。
6.2.客户端
在客户端这边, 我们该创建一个端点来初始化请求/响应通信,如下:
我们来研究下RSocket请求。 首先我们定义了路由和请求负载。 然后,我们定义了使用retrieveFlux()调用的响应期望。这部分决定了交互模式。 另外注意:由于我们的客户端也是REST风格的服务器,客户端也定义了响应媒介类型MediaType.TEXT_EVENT_STREAM_VALUE。
这里我们给异常处理方法标记注解为@MessageExceptionHandler。作为结果, 这个方法将处理所有类型的异常, 因为Exception是所有其他类型的异常的超类。 我们也可以明确地创建更多的不同类型的,不同的异常处理方法。 这当然是请求/响应模式,并且我们返回的是Mono<MarketData>。我们期望这里的响应类型跟我们的交互模式的返回类型相匹配。
❹ 关于springboot 时间问题请教
mysql 的时区默认是系统的时区,即操作系统的服务器时区,你就设置成GMT+8 东八区就好了,springboot连接数据源手动指定GMT+8 ,就没有问题了
❺ springboot菜鸟教程
作为springboot的菜鸟,先了解几个配置:
1、mvc:
spring.mvc.async.request-timeout
设定async请求的超时时间,以毫秒为单位,如果没有设置的话,以具体实现的超时时间为准,比如tomcat的servlet3的话是10秒.
spring.mvc.date-format
设定日期的格式,比如dd/MM/yyyy.
spring.mvc.favicon.enabled
是否支持favicon.ico,默认3: true
spring.mvc.ignore-default-model-on-redirect
在重定向时是否忽略默认model的内容,默认为2、true:
spring.mvc.locale
指定使用的Locale.
spring.mvc.message-codes-resolver-format
指定message codes的格式化策略(PREFIX_ERROR_CODE,POSTFIX_ERROR_CODE)spring.mvc.view.prefix
指定mvc视图的前缀.
spring.mvc.view.suffix
指定mvc视图的后缀.
(5)springboot取股票当前时间扩展阅读:
JavaConfig 与常见 Annotation
1、JavaConfig
我们知道 bean 是 Spring IOC 中非常核心的概念,Spring 容器负责 bean 的生命周期的管理。在最初,Spring 使用 XML 配置文件的方式来描述 bean 的定义以及相互间的依赖关系。
但随着 Spring 的发展,越来越多的人对这种方式表示不满,因为 Spring 项目的所有业务类均以 bean 的形式配置在 XML 文件中,造成了大量的 XML 文件,使项目变得复杂且难以管理。
2、ComponentScan
@ComponentScan 注解对应 XML 配置形式中的 <context:component-scan>元素,表示启用组件扫描,Spring 会自动扫描所有通过注解配置的 bean,然后将其注册到 IOC 容器中。
我们可以通过 basePackages 等属性来指定 @ComponentScan 自动扫描的范围,如果不指定,默认从声明 @ComponentScan 所在类的 package 进行扫描。
❻ springboot启动流程
springboot启动流程如下:
启动流程主要分为三个部分,第一部分进行、SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块。
及核心的创建上下文环境模块,第三部分是自动化配置模块,该模块作为springboot自动配置核心,在后面的分析中会详细讨论。在下面的启动程序中我们会串联起结构中的主要功能。
启动过程主要做了以下几件事情:
配置属性、获取监听器,发布应用开始启动事件初、始化输入参数、配置环境,输出banner、创建上下文、预处理上下文、刷新上下文(加载tomcat容器)、再刷新上下文、发布应用已经启动事件、发布应用启动完成事件。
在SpringBoot中启动tomcat的工作在刷新上下这一步。
而tomcat的启动主要是实例化两个组件:Connector、Container,一个tomcat实例就是一个Server,一个Server包含多个Service,也就是多个应用程序,每个Service包含多个Connector和一个Container,而一个Container下又包含多个子容器。
❼ spring boot 几种定时任务的实现方式
定时任务实现的几种方式:
创建任务类:
使同一个线程中串行执行,如果只有一个定时任务,这样做肯定没问题,当定时任务增多,如果一个任务卡死,会导致其他任务也无法执行。
在传统的Spring项目中,我们可以在xml配置文件添加task的配置,而在SpringBoot项目中一般使用config配置类的方式添加配置,所以新建一个AsyncConfig类
@Configuration:表明该类是一个配置类
@EnableAsync:开启异步事件的支持
然后在定时任务的类或者方法上添加@Async 。最后重启项目,每一个任务都是在不同的线程中
执行时间的配置
在上面的定时任务中,我们在方法上使用@Scheled注解来设置任务的执行时间,并且使用三种属性配置方式:
fixedRate:定义一个按一定频率执行的定时任务
fixedDelay:定义一个按一定频率执行的定时任务,与上面不同的是,改属性可以配合initialDelay, 定义该任务延迟执行时间。
cron:通过表达式来配置任务执行时间
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。按顺序依次为:
其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于”月份中的日期”和”星期中的日期”这两个元素互斥的,必须要对其中一个设置。配置实例:
有些子表达式能包含一些范围或列表
“*”字符代表所有可能的值
“/”字符用来指定数值的增量
“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值
当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
“L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写
如果在“L”前有具体的内容,它就具有其他的含义了。
W 字符代表着平日(Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。
C:代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。
在线cron表达式生成: http://qqe2.com/cron/index
如果SpringBoot版本是2.0.0以后的,则在spring-boot-starter中已经包含了quart的依赖,则可以直接使用 spring-boot-starter-quartz 依赖:
如果是1.5.9则要使用以下添加依赖:
这里我使用SpringBoot版本是 2.0.0.BUILD-SNAPSHOT ,该版本开始集成了Quartz,所以事实现起来很方便。其它好像比较麻烦,这里就不介绍,以后有时间再详细深入了解Quartz。
上面都是简单的介绍了关于SpringBoot定时任务的处理,直接使用SpringTask注解的方式应该是最方便的,而使用Quartz从2.0开始也变得很方便。对于这两种方式,应该说各有长处吧,按需选择。另外关于Quartz的详细内容可以查看官方文档: 传送门
❽ 读取Springboot的三种方式
1.通过Value注解
<code>
package com.hengan.springboottest.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
//读取配置文件
@Value("${user.uname}")
private Stringuname;
@RequestMapping("/method1")
public String getProp(){
return "读取配置文件的第一种方式:通过Value注解 "+uname;
}
}
</code>
2.通过Environment类
```
package com.hengan.springboottest.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private Environmentenv;
@RequestMapping("/method2")
public String getProp2(){
return "读取配置文件的第二种方式Env: "+env.getProperty("user.uname");
}
}
```
3.通过配置实体类
```
package com.hengan.springboottest.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private ReadConfFilereadConfFile;
@RequestMapping("/method3")
public ReadConfFile getProp3(){
return readConfFile;
}
}
```
```
package com.hengan.springboottest.controller;
import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
//用@Data省去了getter,setter
@Data
//@ToString注解免去了手动写toString方法
@ToString
//是否当前缀不符合时抛出异常
@ConfigurationProperties(prefix ="user",ignoreUnknownFields =false)
@PropertySource("classpath:")
//声明一个组件
@Component
public class ReadConfFile {
private Stringuname;
private Stringpwd;
private Stringage;
private Stringaddr;
private Stringsex;
}
```
❾ springboot时间少8个小时的处理方法
有时候在java程序中,时间比实际时间少8个小时,原因可能会有两个
一、springboot没有设置时区
设置方式是在springboot的yml文件里面设置东八区的时间,可以配合格式化使用,具体写法是:
spring:
# jackson时间格式化
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm
二、mysql没有设置时区
如果不是进行了第一个设置还没解决问题,mysql版本用的是6.X的话,需要在url加上serverTimezone=Asia/Shanghai把时区配置成上海的
url: jdbc:mysql://xx.xx.xx.xx:3306/mysqlName?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
❿ springboot中yml日志目录的时间怎么取
一、YAML基本语法
二、YAML支持的数据格式
三、读取yml配置文件
四、测试
一、YAML基本语法以缩进代表层级关系
缩进不能使用tab,只能用空格
空格个数不重要,但是同一层级必须左对齐
大小写敏感
数据格式为,名称:(空格)值
注释单行用#,只能注释单行
二、YAML支持的数据格式字面量:数字、字符串、布尔等不可再分的值
字符串默认不需要加单引号或者双引号,如果加双引号,它不会转义字符串里面的特殊字符,而加单引号,则会转义字符串里面的特殊字符,意思就是将特殊字符直接变为字符串输出。