❶ 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支持的數據格式字面量:數字、字元串、布爾等不可再分的值
字元串默認不需要加單引號或者雙引號,如果加雙引號,它不會轉義字元串裡面的特殊字元,而加單引號,則會轉義字元串裡面的特殊字元,意思就是將特殊字元直接變為字元串輸出。