Spring Annotation
Thu, Sep 5, 2019
閱讀時間 3 分鐘
Spring 常用 annotation 筆記
Cron
@EnableScheduling
@Scheduled
cron屬性
second、minute、hour、day of month (日)、month、day of week(星期幾)
0 * * * * MON-FRI (周一到週五 每分鐘)
* * * * * MON-FRI (周一到週五每秒)
0,1,2,3,4 * * * * * MON-FRI (枚舉,0-4秒)
0-4 * * * * * MON-FRI (直接,0-4秒)
0/4 * * * * * MON-FRI (0秒啟動,每4秒執行一次)
秒:可出現”, – * /”四個字元,有效範圍為0-59的整數
分:可出現”, – * /”四個字元,有效範圍為0-59的整數
時:可出現”, – * /”四個字元,有效範圍為0-23的整數
每月第幾天:可出現”, – * / ? L W C”八個字元,有效範圍為0-31的整數
月:可出現”, – * /”四個字元,有效範圍為1-12的整數或JAN-DEC
星期:可出現”, – * / ? L C #”四個字元,有效範圍為0-7的整數或SUN-SAT兩個範圍。0,1 都是星期日 1-6 星期一到六
* : 表示匹配該域的任意值,比如在秒*, 就表示每秒都會觸發事件。;
? : 只能用在每月第幾天和星期兩個域。表示不指定值,當2個子表示式其中之一被指定了值以後,為了避免衝突,需要將另一個子表示式的值設為“?”;
– : 表示範圍,例如在分域使用5-20,表示從5分到20分鐘每分鐘觸發一次
/ : 表示起始時間開始觸發,然後每隔固定時間觸發一次,例如在分域使用5/20,則意味著5分,25分,45分,分別觸發一次.
, : 表示列出列舉值。例如:在分域使用5,20,則意味著在5和20分時觸發一次。
L : 表示最後,只能出現在星期和每月第幾天域,如果在星期域使用1L,意味著在最後的一個星期日觸發。
W : 表示有效工作日(週一到週五),只能出現在每月第幾日域,系統將在離指定日期的最近的有效工作日觸發事件。注意一點,W的最近尋找不會跨過月份
LW : 這兩個字元可以連用,表示在某個月最後一個工作日,即最後一個星期五。
# : 用於確定每個月第幾個星期幾,只能出現在每月第幾天域。例如在1#3,表示某月的第三個星期一。4#2 第二個星期四
(1)cron:cron表示式,指定任務在特定時間執行;
(2)fixedDelay:表示上一次任務執行完成後多久再次執行,引數型別為long,單位ms;
(3)fixedDelayString:與fixedDelay含義一樣,只是引數型別變為String;
(4)fixedRate:表示按一定的頻率執行任務,引數型別為long,單位ms;
(5)fixedRateString: 與fixedRate的含義一樣,只是將引數型別變為String;
(6)initialDelay:表示延遲多久再第一次執行任務,引數型別為long,單位ms;
(7)initialDelayString:與initialDelay的含義一樣,只是將引數型別變為String;
example:
“0 0 * * * *” 表示每小時0分0秒執行一次
” */10 * * * * *” 表示每10秒執行一次
“0 0 8-10 * * *” 表示每天8,9,10點執行
“0 0/30 8-10 * * *” 表示每天8點到10點,每半小時執行
“0 0 9-17 * * MON-FRI” 表示每週一至週五,9點到17點的0分0秒執行
“0 0 0 25 12 ?” 表示每年聖誕節(12月25日)0時0分0秒執行
表達式參考:
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/6009/
https://gitee.com/jack90john/spring-boot-timmer
@Scheduled(fixedDelay = 5000) //fixedDelay = 5000表示當前方法執行完畢5000ms後,Spring scheduling會再次呼叫該方法
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
properties
spring.mail.username=
spring.mail.password=
spring.mail.host=
spring.mail.properties.mail.smtp.ssl.enable=true (SSL 安全機制)
REF properties
# =================================
# Mail
# =================================
spring.mail.default-encoding=UTF-8
# Gmail SMTP
spring.mail.host=smtp.gmail.com
# TLS , port 587
spring.mail.port=587
spring.mail.username=my.account@gmail.com
spring.mail.password=my.password
# Other properties
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
透過config設置
@Configuration
public class MailConfig {
@Bean
public JavaMailSender getJavaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost("smtp.gmail.com");
mailSender.setPort(587);
mailSender.setUsername("my.gmail@gmail.com");
mailSender.setPassword("my.password");
Properties props = mailSender.getJavaMailProperties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.starttls.required", "true");
props.put("mail.debug", "true");
return mailSender;
}
}
調用
@AutoWired
JavaMailSenderImpl javaMail;
@Test
XXXXX
SimpleMailMessage msg=new SimpleMailMessage();
msg.setSubject("標題");
msg.setText("內容");
msg.setTo("去哪裡@gmail.com");
msg.setFrom("從哪裡@gmail.com");
javaMail.send(msg);
有兩步驟驗證的話:
左側導覽面板上的 [安全性],按一下底部的 [選取應用程式],然後選擇您使用的應用程式,或是建立一組應用程式使用用的密碼
選其他 => 自命名 =>產生16位密碼 =>當成正式密碼 丟在properties中
複雜mail
MimeMessage mimeMsg=javaMailSender.createMimeMessage();
MimeMessageHelper helper=new MimeMessageHelper(mimeMsg ,(multipart:)true);
helper.setSubject("標題");
helper.setText("<strong>內容</strong>",(html編譯) true); (可加html標籤,後面預設是false)
helper.setTo("去哪裡@gmail.com");
helper.setFrom("從哪裡@gmail.com");
helper.addAttachement("檔名",new File("檔案位置"));
javaMail.send(mimeMsg);
Actuator
Actuator 提供了 13 個接口,具體如下表所示 (引用自think power)think power
路徑 | 描述 |
---|---|
/health | 展示系統的各種組件運行狀態、硬碟使用狀況 |
/metrics | 統計系統當前的一些即時信息,如:該系統接收了多少個請求、cache命中率、mq中有多少條信息待處理、CPU使用率、內存占用情況等。 |
/metrics/{name} | 報告指定名稱的應用進程度量值 |
/dump | 當前系統中線程的詳細信息 |
/env | 展示系統變量 和 springboot的應用變量 |
/env/{name} | 根據名稱獲取特定的環境屬性值 |
/trace | 顯示最近的http請求的request、response對(默認最多緩存100條) |
/autoconfig | 展示所有auto-configuration候選者及它們被應用或未被應用的原因 |
/info | 顯示應用自定義的信息:如該應用的聯繫人、名稱、版本等 |
/configprops | 顯示所有被@ConfigurationProperties mark的Bean的信息列表 |
/mappings | 顯示所有@RequestMapping mark 的url list |
/shutdown | 允許以POST方式關閉應用,要求endpoints.shutdown.enabled設置為true |
/beans | 顯示該應用中所有Spring Beans的完整信息,包括依賴了哪些bean、是singleton還是prototype |
spring boot 2參考用表
id | 效果 | default value |
---|---|---|
auditevents | 顯示當前訊息事件 | Y |
beans | 顯示應用Spring Beans的完整列表 | Y |
caches | 顯示可cache訊息 | Y |
conditions | 顯示autoconfig 的狀態與應用訊息 | Y |
configprops | 顯示所有@ConfigurationProperties 列表 | Y |
env | 顯示ConfigurableEnvironment 中的属性 | Y |
flyway | 顯示Flyway 中data遷移訊息 | Y |
health | 顯示應運的訊息(為認證只顯示status,已認證顯示全部) | Y |
info | 很直白 | Y |
liquibase | 跟fly依樣,顯示liquibase | Y |
metrics | 顯示當前metrics訊息 | Y |
mappings | 顯示所有@RequestMapping | Y |
scheduledtasks | 顯示所有scheduledtasks | Y |
sessions | ... | Y |
shutdown | 若是true時,可發/shutdown 的post req去關閉server | N |
threaddump | 執行一個thread的dump | Y |
httptrace | 顯示最後執行的100的http req | Y |
heapdump | return gzip 的dump文件 | Y |
prometheus | Prometheus的格式顯示metrics訊息 | Y |
參考掘金https://juejin.im/post/5d78afa951882505e029c57e
配置path
management.endpoints.web.basePath=
全部啟用 management.endpoints.enabled-by-default
management.endpoints.enabled-by-default=true
全部停用,只啟用部分
management.endpoints.enabled-by-default=false
management.endpoint.[id].enabled=true
開放與封閉
management.endpoints.<web|jmx>.exposure.<include|exclude>
* 開放所有所有web端點,如果暴露的是一個要用 id 並以逗號隔開
management.endpoints.web.exposure.include='*'
排除端點
management.endpoints.web.exposure.exclude=
安全性
可用上面方法 或是 此方法關閉敏感端點 ex: /shutdown 或是使用Spring security 來搭配使用
management.server.port=-1
自訂義 (boot 2 開始,Actuator支援CRUD模型)
@Endpoint 支援JMX和http @JmxEndpoint 只支援JMX @WebEndpoint 只支援http
通過在一個端點類(必須是Spring Bean)上添加上面其中一個來表明該類是一個端點類。 在類的方法使用 @ReadOperation @WriteOperation @DeleteOperation,這分別會orm到Http中的GET,POST,DELETE。以下範例
@Component
@Endpoint(id = "features")
public class FeaturesEndpoint {
private Map<String, Feature> features = new ConcurrentHashMap<>();
@ReadOperation
public Map<String, Feature> features() {
return features;
}
@ReadOperation
public Feature feature(@Selector String name) {
return features.get(name);
}
@WriteOperation
public void configureFeature(@Selector String name, Feature feature) {
features.put(name, feature);
}
@DeleteOperation
public void deleteFeature(@Selector String name) {
features.remove(name);
}
public static class Feature {
private Boolean enabled;
// getters and setters ...
}
}
應用延伸
可以使用 @EndpointExtension @EndpointWebExtension @EndpointJmxExtension 來延伸端點行為
@Component
@EndpointWebExtension(endpoint = InfoEndpoint.class)
public class InfoWebEndpointExtension {
private InfoEndpoint delegate;
// standard constructor
@ReadOperation
public WebEndpointResponse<Map> info() {
Map<String, Object> info = this.delegate.info();
Integer status = getStatus(info);
return new WebEndpointResponse<>(info, status);
}
private Integer getStatus(Map<String, Object> info) {
// return 5xx if this is a snapshot
return 200;
}
}
-
啟用端點 env management.endpoint.env.enabled=true
-
暴露端點 env 配置多個,隔開 management.endpoints.web.exposure.include=env
-
開啟全部 management.endpoint..enabled=true management.endpoints.web.exposure.include=
使用非同步 (待補…)
@EnableAsync
@Async