CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.
Bài đăng trên blog CFSDN này về swagger, các vấn đề về tác vụ asynchronous/timing/mail trong springboot được tác giả thu thập và sắp xếp. Nếu bạn quan tâm đến bài viết này, vui lòng thích nó.
1. SpringBoot: Phiên bản Swagger Ultimate tích hợp

Mục tiêu học tập:
- Hiểu khái niệm và chức năng của Swagger
- Làm chủ việc tích hợp Swagger vào dự án của bạn để tự động tạo tài liệu API
.
1.1. Giới thiệu về Swagger
Phần đầu và phần đuôi được tách biệt.
- Front-end -> Lớp điều khiển front-end, lớp view
- Backend -> Lớp điều khiển Backend, lớp dịch vụ, lớp truy cập dữ liệu
- Phần đầu và phần cuối tương tác thông qua API
- Phần đầu và phần sau tương đối độc lập và được ghép nối lỏng lẻo
Những vấn đề phát sinh.
- Tích hợp front-end và back-end, front-end hoặc back-end không thể đạt được "đàm phán kịp thời và giải quyết sớm", cuối cùng dẫn đến bùng phát các vấn đề
Giải pháp.
- Đầu tiên hãy xác định sơ đồ [phác thảo kế hoạch] và theo dõi API mới nhất theo thời gian thực để giảm thiểu rủi ro tích hợp
Đi vênh vang.
- Được biết đến là khuôn khổ API phổ biến nhất thế giới
- Trình tạo tài liệu API Restful trực tuyến tự động => Tài liệu API và định nghĩa API được cập nhật đồng bộ
- Chạy trực tiếp và kiểm tra API trực tuyến
- Hỗ trợ nhiều ngôn ngữ (như: java, php, v.v.)
- Trang web chính thức: https://swagger.io/
.
1.2. SpringBoot tích hợp Swagger
SpringBoot tích hợp Swagger => springfox, hai gói jar.
- Springfox-swagger2
- swagger-springmvc
Sử dụng Swagger.
Yêu cầu: jdk 1.8 + Nếu không swagger2 không thể chạy.
bước chân:
1. Tạo một dự án SpringBoot-web mới.
2. Thêm các phụ thuộc Maven.
-
-
- io.springfox
- springfox-swagger-giao diện người dùng
- 3.0.0
-
-
-
- io.springfox
- springfox-swagger2
- 3.0.0
-
3. Viết HelloController và kiểm tra để đảm bảo nó chạy thành công! .
4. Để sử dụng Swagger, chúng ta cần viết lớp cấu hình - SwaggerConfig để cấu hình Swagger.
- @Cấu hình //Lớp cấu hình
- @EnableSwagger2// Bật cấu hình tự động của Swagger2
- công cộng lớp học Cấu hình Swagger {
- }
5. Truy cập trang kiểm tra: http://localhost:8080/swagger-ui.html, bạn có thể thấy giao diện swagger; .

Điều quan trọng là phải viết tên tài liệu và mô tả, đây là hai tham số đầu tiên của cấu trúc tham số ApiInfo.
.
1.3. Cấu hình Swagger
1. Bean của phiên bản Swagger là Docket, do đó hãy cấu hình Swagger bằng cách cấu hình phiên bản Docket.
- //Cấu hình phiên bản bean của docket của swagger
- @Đậu
- công cộng Hồ sơ lấyDocket(){
- trở lại mới Hồ sơ(Loại tài liệu.VẺ ĐẸP_2);
- }
2. Thông tin tài liệu có thể được cấu hình thông qua thuộc tính apiInfo().
- //Cấu hình thông tin tài liệu
- riêng tư Thông tin API Thông tin api() http://www.cppcns.com{
- Liên hệ liên hệ = mới Liên hệ("Tên liên hệ", "http://xxx.xxx.com/Liên kết truy cập liên hệ", "Email liên hệ");
- trở lại mới Thông tin API(
- "Học tập một cách tự tin", // Tiêu đề
- "Tìm hiểu cách cấu hình Swagger", // mô tả
- "v1.0", // Phiên bản
- "http://terms.service.url/Liên kết tổ chức", //Tổ chức liên kết
- liên hệ, // Thông tin liên lạc
- "Giấy phép Apache 2.0", // Giấy phép
- "Liên kết giấy phép", // Cho phép kết nối
- mới MảngDanh sách<>()// Sự mở rộng
- );
- }
3. Liên kết thể hiện Docket với apiInfo().
- @Đậu
- công cộng Hồ sơ hồ sơ() {
- trở lại mới Hồ sơ(Loại tài liệu.VẺ ĐẸP_2).Thông tin api(Thông tin api());
- }
4. Khởi động lại dự án và truy cập trang thử nghiệm http://localhost:8080/swagger-ui.html để xem hiệu ứng; .

.
1.4. Cấu hình giao diện quét
1. Khi xây dựng Docket, hãy cấu hình cách quét giao diện thông qua phương thức select().
- @Đậu
- công cộng Hồ sơ hồ sơ() {
- trở lại mới Hồ sơ(Loại tài liệu.VẺ ĐẸP_2)
- .Thông tin api(Thông tin api())
- .lựa chọn()// Sử dụng phương thức .select() để cấu hình giao diện quét và RequestHandlerSelectors để cấu hình cách quét giao diện
- .API(RequestHandlerSelectors.Gói cơ sở("com.wei.swagger.controller"))
- .xây dựng();
- }
2. Khởi động lại thử nghiệm dự án. Vì chúng tôi đã cấu hình giao diện để quét theo đường dẫn gói, nên chúng tôi chỉ có thể thấy một lớp.
3. Ngoài việc cấu hình giao diện quét thông qua đường dẫn gói tin, bạn cũng có thể cấu hình giao diện quét theo những cách khác. Sau đây là tất cả các phương pháp cấu hình:
- bất kì() // Quét tất cả, tất cả các giao diện trong dự án sẽ được quét
- không có() // Không quét giao diện
- // Quét theo chú thích trên phương thức, chẳng hạn như withMethodAnnotation(GetMapping.class) để chỉ quét các yêu cầu get
- với MethodAnnotation(cuối cùng Lớp học mở rộng Chú thích> chú thích)
- // Quét theo chú thích trên lớp, chẳng hạn như .withClassAnnotation(Controller.class) để chỉ quét các giao diện trong lớp có chú thích bộ điều khiển
- vớiClassAnnotation(cuối cùng Lớp học mở rộng Chú thích> chú thích)
- Gói cơ sở(cuối cùng Sợi dây Gói cơ sở) // Quét giao diện theo đường dẫn gói
4. Ngoài ra, chúng ta cũng có thể cấu hình đường dẫn lọc quét giao diện:
- //Cấu hình phiên bản bean của docket của swagger
- @Đậu
- công cộng Hồ sơ lấyDocket(Môi trường môi trường){
- trở lại mới Hồ sơ(Loại tài liệu.VẺ ĐẸP_2)
- .Thông tin api(lấyApiInfo())
- .lựa chọn()
- //RequestHandlerSelectors cấu hình cách quét giao diện,
- //basePackage chỉ định gói để swagger quét
- //RequestHandlerSelectors cũng có phương thức any và none
- //withClassAnnotation chỉ quét các lớp có chú thích XX
- //withMethodAnnotation chỉ quét các phương thức có chú thích XX
- .API(RequestHandlerSelectors.Gói cơ sở("com.wei.swagger.controller"))
- //đường dẫn lọc đường dẫn
- .đường dẫn(Bộ chọn đường dẫn.kiến("/vị/**"))
- .xây dựng();
- }
5. Có những giá trị tùy chọn khác ở đây.
- bất kì() //Quét bất kỳ yêu cầu nào
- không có() // Không quét bất kỳ yêu cầu nào
- biểu thức chính quy(cuối cùng Sợi dây đường dẫnRegex) // Được điều khiển bởi biểu thức chính quy
- kiến(cuối cùng Sợi dây mẫu kiến) //Được điều khiển bởi ant()
.
1.5. Cấu hình công tắc Swagger
1. Cấu hình xem có bật swagger thông qua phương thức enable() hay không. Nếu sai, swagger sẽ không thể truy cập được trong trình duyệt.
cho phép lập trình chuỗi.
- @Đậu
- công cộng Hồ sơ lấyDocket(Môi trường môi trường){
- trở lại mới Hồ sơ(Loại tài liệu.VẺ ĐẸP_2)
- .cho phép(SAI)// Vô hiệu hóa swagger: false. Mặc định là true được bật
- .Thông tin api(lấyApiInfo())
- .lựa chọn()
- //RequestHandlerSelectors cấu hình cách quét giao diện,
- //basePackage chỉ định gói để swagger quét
- //RequestHandlerSelectors cũng có phương thức any và none
- //withClassAnnotation chỉ quét các lớp có chú thích XX
- //withMethodAnnotation chỉ quét các phương thức có chú thích XX
- .API(RequestHandlerSelectors.Gói cơ sở("com.wei.swagger.controller"))
- //đường dẫn lọc đường dẫn
- .đường dẫn(Bộ chọn đường dẫn.kiến("/vị/**"))
- .xây dựng();
- }
2. Làm thế nào để cấu hình động dự án để hiển thị swagger khi nó ở trong môi trường thử nghiệm và phát triển, nhưng không phải trong môi trường sản xuất?
- @Đậu
- công cộng Hồ sơ lấyDocket(Môi trường môi trường){
- Hồ sơ hồ sơ = Hồ sơ.của("phát triển","Bài kiểm tra"); //dev hoặc test
- Hệ thống.ngoài.inl(hồ sơ);
- //Sử dụng environment.acceptsProfiles(profiles) để xác định xem bạn có đang ở trong môi trường bạn thiết lập hay không
- Boolean b = môi trường.chấp nhậnHồ sơ(hồ sơ);
- trở lại mới Hồ sơ(Loại tài liệu.VẺ ĐẸP_2)
- .cho phép(b)// Vô hiệu hóa swagger: false. Mặc định là true được bật
- .Thông tin api(lấyApiInfo())
- .lựa chọn()
- //RequestHandlerSelectors cấu hình cách quét giao diện,
- //basePackage chỉ định gói để swagger quét
- //RequestHandlerSelectors cũng có phương thức any và none
- //withClassAnnotation chỉ quét các lớp có chú thích XX
- //withMethodAnnotation chỉ quét các phương thức có chú thích XX
- .API(RequestHandlerSelectors.Gói cơ sở("com.wei.swagger.controller"))
- //đường dẫn lọc đường dẫn
- .đường dẫn(Bộ chọn đường dẫn.kiến("/vị/**"))
- .xây dựng();
- }
3. Bạn có thể thêm tệp cấu hình dev vào dự án để xem hiệu ứng! .

4. Cũng có thể thực hiện thông qua file cấu hình, nhưng giao diện hiển thị không thân thiện. ứng dụng.thuộc tính.
- mùa xuân.hồ sơ.tích cực=sản xuất
ứng dụng-phát triển.thuộc tính.
- cáo xuân.tài liệu.đi vênh vang-giao diện người dùng.đã bật=ĐÚNG VẬY
ứng dụng-sản phẩm.properties .
- cáo xuân.tài liệu.đi vênh vang-giao diện người dùng.đã bật=SAI

.
1.6. Cấu hình nhóm API

1. Nếu không có nhóm nào được cấu hình, thì mặc định sẽ là mặc định. Nhóm có thể được cấu hình thông qua phương thức groupName():
- @Đậu
- công cộng Hồ sơ hồ sơ(Môi trường môi trường) {
- trở lại mới Hồ sơ(Loại tài liệu.VẺ ĐẸP_2).Thông tin api(Thông tin api())
- .Tên nhóm("nhóm 1") //Cấu hình nhóm
- // Bỏ qua cấu hình....
- }
2. Khởi động lại dự án để xem nhóm.
3. Làm thế nào để cấu hình nhiều nhóm? Để cấu hình nhiều nhóm, bạn chỉ cần cấu hình nhiều docket:
- @Đậu
- công cộng Hồ sơ lấyDocket2(){
- trở lại mới Hồ sơ(Loại tài liệu.VẺ ĐẸP_2).Tên nhóm("nhóm 2");
- }
- @Đậu
- công cộng Hồ sơ lấyDocket3(){
- trở lại mới Hồ sơ(Loại tài liệu.VẺ ĐẸP_2).Tên nhóm("nhóm 3");
- }
4. Khởi động lại dự án và xem nó.
.
1.7 Cấu hình thực thể
1. Tạo một lớp thực thể mới.
- bưu kiện cùng với.vi.đi vênh vang.pojo;
-
- nhập khẩu tôi.đi vênh vang.chú thích.Mô hình API;
- nhập khẩu tôi.đi vênh vang.chú thích.Thuộc tính ApiModel;
- nhập khẩu lombok.Dữ liệu;
-
- @ApiModel("lớp thực thể người dùng")
- @Dữ liệu
- công cộng lớp học Người sử dụng {
- @ApiModelThuộc tính("tên người dùng")
- riêng tư Sợi dây tên người dùng;
- @ApiModelThuộc tính("mật khẩu")
- riêng tư Sợi dây mật khẩu;
- }
2. Miễn là thực thể nằm trong giá trị trả về của giao diện yêu cầu (kể cả khi nó là chung chung), thì nó có thể được ánh xạ tới mục thực thể:
- @Yêu cầu lập bản đồ(giá trị = "/người dùng" , phương pháp = Phương pháp yêu cầu.BƯU KIỆN)
- công cộng Người sử dụng người sử dụng(){
- trở lại mới Người sử dụng();
- }
3. Khởi động lại và kiểm tra.

Lưu ý: Không phải vì chú thích @ApiModel mà thực thể được hiển thị ở đây, mà miễn là thực thể xuất hiện trong giá trị trả về của phương thức giao diện thì nó sẽ được hiển thị ở đây và chú thích @ApiModel và @ApiModelProperty chỉ được sử dụng để thêm chú thích vào thực thể.
@ApiModel chú thích cho lớp.
@ApiModelProperty chú thích thuộc tính của lớp.
.
1.8. Chú thích chung
Tất cả chú thích Swagger đều được định nghĩa trong gói io.swagger.annotations.
Sau đây là một số cách thường dùng. Đối với những cách không được liệt kê, vui lòng tham khảo hướng dẫn riêng:
Chú thích Swagger |
Mô tả đơn giản |
@Api(tags = "mô tả mô-đun xxx") |
Hành động trên các lớp mô-đun |
@ApiOperation("mô tả giao diện xxx") |
Hành động trên các phương thức giao diện |
@ApiModel("mô tả xxxPOJO") |
Hành động trên các lớp mô hình: chẳng hạn như VO, BO |
@ApiModelProperty(giá trị = "mô tả thuộc tính xxx", ẩn = đúng) |
Áp dụng cho các phương thức và thuộc tính của lớp. Đặt hidden thành true có thể ẩn thuộc tính. |
@ApiPhttp://www.cppcns.comaram("mô tả tham số xxx") |
Hành động trên các tham số, phương thức và trường, tương tự như @ApiModelProperty |
Chúng ta cũng có thể cấu hình một số chú thích cho giao diện được yêu cầu.
- @Hoạt độngApi("yêu cầu thử nghiệm")
- @Yêu cầu lập bản đồ(giá trị = "/Bài kiểm tra" , phương pháp = Phương pháp yêu cầu.LẤY)
- công cộng Sợi dây Bài kiểm tra(@ApiParam("tên") Sợi dây tên){
- trở lại "Bài kiểm tra"+tên;
- }
Kết quả thử nghiệm như sau.

Thêm chú thích vào bộ điều khiển.
- @Api(thẻ = "Xin chào người điều khiển")
- công cộng lớp học Xin chàoBộ điều khiển {
- }
Bằng cách này, bạn có thể thêm một số thông tin cấu hình vào một số thuộc tính hoặc giao diện khó hiểu hơn, giúp chúng dễ đọc hơn! .
So với phương pháp kiểm tra giao diện Postman hoặc Curl truyền thống, sử dụng swagger là một hoạt động chống lỗi. Nó không yêu cầu tài liệu bổ sung (bản thân tài liệu được viết tốt cũng là một tài liệu) và ít có khả năng xảy ra lỗi. Bạn chỉ cần nhập dữ liệu và nhấp vào Thực hiện. Nếu kết hợp với một khuôn khổ tự động hóa, có thể nói rằng về cơ bản không cần thao tác thủ công.
Swagger là một công cụ tuyệt vời. Hiện nay, nhiều công ty Internet vừa và nhỏ ở Trung Quốc đang sử dụng công cụ này. So với phương pháp truyền thống là tạo tài liệu giao diện Word trước rồi mới thử nghiệm, thì rõ ràng là phương pháp này phù hợp hơn với tình hình phát triển lặp lại nhanh chóng hiện nay. Tất nhiên, tôi muốn nhắc bạn đóng Swagger trong môi trường chính thức vì lý do bảo mật và để tiết kiệm bộ nhớ thời gian chạy.
Tóm tắt: 1. Chúng ta có thể sử dụng swagger để thêm thông tin chú thích vào một số thuộc tính hoặc giao diện khó hiểu. 2. Tài liệu giao diện được cập nhật theo thời gian thực. 3. Có thể kiểm tra trực tuyến.
.
1.9. Mở rộng: Các giao diện khác
Chúng ta có thể nhập các gói khác nhau để triển khai các định nghĩa giao diện khác nhau:
1. Đường dẫn truy cập mặc định là http://localhost:8080/swagger-ui/.
-
- io.springfox
- springfox-swagger-giao diện người dùng
- 2.9.2
-

2. Bootstrap-ui truy cập http://localhost:8080/doc.html.
-
-
- liên hệgithub.xiaoymin
- swagger-bootstrap-ui
- 1.9.1
-

3. Layui-ui truy cập http://localhost:8080/docs.html.
-
-
- com.github.caspar-chen
- swagger-ui-lớp
- 1.1.3
-

4. mg-ui truy cập http://localhost:8080/document.html.
-
-
- com.zyplayer
- swagger-mg-ui
- 1.0.6
-

.
2. SpringBoot: tác vụ không đồng bộ, theo thời gian và email
.
2.1. Nhiệm vụ không đồng bộ
Viết phương pháp để giả vờ dữ liệu đang được xử lý, sử dụng luồng để thiết lập một số độ trễ và mô phỏng các tình huống chờ đồng bộ;
- @Dịch vụ
- công cộng lớp học Dịch vụ bất đồng bộ {
-
- công cộng vô hiệu Xin chào(){
- thử {
- Chủ đề.ngủ(3000);
- } nắm lấy (Ngoại lệ bị ngắt và) {
- và.inStackTrace();
- }
- Hệ thống.ngoài.inl("Công việc đang tiến triển...");
- }
- }
3. Viết gói điều khiển.
4. Viết lớp AsyncController.
Hãy viết một Bộ điều khiển để kiểm tra nó.
- @Bộ điều khiển nghỉ ngơi
- công cộng lớp học Bộ điều khiển không đồng bộ {
-
- @Autowired
- Dịch vụ bất đồng bộ Dịch vụ async;
-
- @GetMapping("/Xin chào")
- công cộng Sợi dây Xin chào(){
- Dịch vụ async.Xin chào();
- trở lại "Xin chào!!!Được!!!";
- }
-
- }
5. Truy cập http://localhost:8080/hello để kiểm tra. Sau 3 giây, hello!!!ok!!! xuất hiện. Đây là tình huống chờ đồng bộ.
Câu hỏi: Nếu chúng ta muốn người dùng nhận tin nhắn trực tiếp, chúng ta có thể sử dụng đa luồng ở chế độ nền. Tuy nhiên, việc viết thủ công triển khai đa luồng mỗi lần là quá phiền phức. Chúng ta chỉ cần sử dụng một phương thức đơn giản và thêm một chú thích đơn giản vào phương thức của mình, như sau:
6. Thêm chú thích @Async vào phương thức hello; .
- //Nói với Spring rằng đây là phương thức bất đồng bộ
- @Không đồng bộ
- công cộng vô hiệu Xin chào(){
- thử {
- Chủ đề.ngủ(3000);
- } nắm lấy (Ngoại lệ bị ngắt và) {
- và.inStackTrace();
- }
- Hệ thống.ngoài.inl("Công việc đang tiến triển...");
- }
SpringBoot sẽ tự mở một nhóm luồng và thực hiện lệnh gọi! Tuy nhiên, để chú thích này có hiệu quả, chúng ta cũng cần thêm chú thích @EnableAsync vào chương trình chính để kích hoạt chức năng chú thích không đồng bộ; .
- @EnableAsync // Kích hoạt chức năng chú thích không đồng bộ
- @SpringBootỨng dụng
- công cộng lớp học Ứng dụng SpringbootTask {
-
- công cộng tĩnh vô hiệu chủ yếu(Sợi dây[] các đối số) {
- Ứng dụng Spring.chạy(Ứng dụng SpringbootTask.lớp học, các đối số);
- }
-
- }
7. Khởi động lại bài kiểm tra, trang web phản hồi ngay lập tức và mã nền vẫn được thực thi! Không cần phải chờ phương thức hello của AsyncService hoàn tất, bạn có thể tiếp tục thực thi câu lệnh sau.
.
2.2. Nhiệm vụ Email
Trong quá trình phát triển hàng ngày, chúng ta thường gửi email. Springboot cũng giúp chúng ta hỗ trợ gửi email. Chúng ta cần giới thiệu spring-boot-start-mail SpringBoot tự động cấu hình MailSenderAutoConfiguration để xác định nội dung MailProperties và cấu hình nó trong application.yml để tự động lắp ráp JavaMailSender (lớp triển khai: JavaMailSenderImpl để viết mã) để kiểm tra việc gửi email.
Bài kiểm tra:
1. Giới thiệu sự phụ thuộc của pom.
-
- org.springframework.boot
- spring-boot-starter-mail
-
2. Xem lớp cấu hình tự động: MailSenderAutoConfiguration.

Trong lớp này có bean JavaMailSenderImpl.

Sau đó chúng ta hãy xem xét tệp cấu hình.
- @Thuộc tính cấu hình(
- tiền tố = "mùa xuân.mail"
- )
- công cộng lớp học Thuộc tính thư {
- riêng tư tĩnh cuối cùng Bộ ký tự DEFAULT_CHARSET;
- riêng tư Sợi dây chủ nhà;
- riêng tư Số nguyên cảng;
- riêng tư Sợi dây tên người dùng;
- riêng tư Sợi dây mật khẩu;
- riêng tư Sợi dây giao thức = "smtp";
- riêng tư Bộ ký tự Mã hóa mặc định;
- riêng tư Bản đồ<Sợi dây, Sợi dây> của cải;
- riêng tư Sợi dây Tên jndi;
- }
3. Tệp cấu hình:
- mùa xuân.thư.tên người dùng=xxx@163.cùng với
- mùa xuân.thư.mật khẩu=của bạn163Mã ủy quyền
- mùa xuân.thư.chủ nhà=smtp.163.com
-
- # Nếu bạn sử dụng qq, bạn cần cấu hình ssl
- mùa xuân.thư.của cải.thư.smtp.ssl.cho phép=ĐÚNG VẬY
4. Kiểm thử đơn vị mùa xuân.
- bưu kiện cùng với.vi;
-
- nhập khẩu tổ chức.tháng sáu.sao Mộc.Giao diện lập trình ứng dụng (API).Bài kiểm tra;
- nhập khẩu tổ chức.khung mùa xuân.đậu.nhà máy.chú thích.Tự động kết nối;
- nhập khẩu tổ chức.khung mùa xuân.khởi động.Bài kiểm tra.bối cảnh.Kiểm tra SpringBoot;
- nhập khẩu tổ chức.khung mùa xuân.thư.Tin nhắn đơn giản;
- nhập khẩu tổ chức.khung mùa xuân.thư.javamail.Người gửi thư Java;
- nhập khẩu tổ chức.khung mùa xuân.thư.javamail.Trợ giúp MimeMessage;
-
- nhập khẩu javax.thư.Ngoại lệ tin nhắn;
- nhập khẩu javax.thư.internet.MimeMessage;
- nhập khẩu java.tôi.Tài liệu;
- nhập khẩu java.tôi.Ngoại lệ IO;
-
- @SpringBootTest
- lớp học Springboot09TestỨng dụngKiểm tra {
- @Autowired
- Người gửi thư Java javaNgười gửi thư;
-
- @Bài kiểm tra
- vô hiệu ngữ cảnhTải() {
- // Gửi email
- Tin nhắn đơn giản thưTin nhắn = mới Tin nhắn đơn giản();
- thưTin nhắn.thiết lậpTừ("xxx@163.com");
- thưTin nhắn.đặt thành("xxx@163.com");
- thưTin nhắn.đặtChủ đề("chủ đề 2..");
- thưTin nhắn.thiết lậpVăn bản("văn bản2...");
- javaNgười gửi thư.gửi(thưTin nhắn);
- }
- @Bài kiểm tra
- vô hiệu ngữ cảnhLoads2() ném Ngoại lệ tin nhắn, Ngoại lệ IO {
- // Gửi email phức tạp
- MimeMessage mimeTin nhắn = javaNgười gửi thư.tạoMimeMessage();
- // Cuộc họp
- Trợ giúp MimeMessage người giúp việc = mới Trợ giúp MimeMessage(mimeTin nhắn,ĐÚNG VẬY); // đúng, hỗ trợ nhiều phần
- người giúp việc.đặtChủ đề("chủ thể");
- người giúp việc.thiết lậpVăn bản("
kiểm tra email phức tạp
",ĐÚNG VẬY); // đúng, hỗ trợ html
- //phụ lục
- Sợi dây Tên tệp = cái này.lấyLớp().lấyClassLoader().lấy Tài nguyên("1.jpg").lấyĐường dẫn(); // Lấy đường dẫn tuyệt đối trong tài nguyên
- người giúp việc.thêmĐính kèm("1.jpg", mới Tài liệu(Tên tệp));
- người giúp việc.thêmĐính kèm("2.jpg", mới Tài liệu(Tên tệp));
-
- người giúp việc.thiết lậpTừ("xxx@163.com"); //gửi
- người giúp việc.đặt thành("xxx@163.com"); //tiếp quản
- javaNgười gửi thư.gửi(mimeTin nhắn);
- }
-
- }
contextTải kết quả.

contextLoads2 kết quả.

Kiểm tra hộp thư của bạn, email đã được nhận thành công! .
Chúng ta chỉ cần sử dụng Thymeleaf để kết hợp front-end và back-end để phát triển chức năng gửi và nhận email cho website của mình! .
.
2.3、Nhiệm vụ có thời gian
Trong quá trình phát triển dự án, thường cần phải thực hiện một số tác vụ theo lịch trình. Ví dụ, cần phải phân tích thông tin nhật ký của ngày hôm trước vào lúc rạng sáng mỗi ngày. Spring cung cấp cho chúng ta một cách để lên lịch các tác vụ không đồng bộ và cung cấp hai giao diện.
- Giao diện TaskExecutor
- Giao diện TaskScheduler
Hai lưu ý:
- @EnableScheduling
- @Đã lên lịch
Tham khảo biểu thức Cron: https://www.cnblogs.com/javahr/p/8318728.html.
Các bước kiểm tra:
1. Tạo một ScheduledService.
Chúng tôi có một phương thức hello cần được thực hiện thường xuyên. Chúng tôi xử lý nó như thế nào?
- nhập khẩu tổ chức.khung mùa xuân.lịch trình.chú thích.Đã lên lịch;
- nhập khẩu tổ chức.khung mùa xuân.khuôn mẫu.Dịch vụ;
- @Dịch vụ
- công cộng lớp học Lịch trìnhNhà trọ lập trìnhdDịch vụ {
- //Thực hiện phương thức này tại một thời điểm cụ thể
- @Đã lên lịch(cron = "Giây, phút, giờ * *?")
- công cộng vô hiệu Xin chào(){
- Hệ thống.ngoài.inl("Xin chào đã bị xử tử");
- }
-
- }
2. Sau khi viết tác vụ theo lịch trình ở đây, chúng ta cần thêm @EnableScheduling vào chương trình chính để kích hoạt chức năng tác vụ theo lịch trình.
- @EnableAsync // Kích hoạt chức năng chú thích không đồng bộ
- @EnableScheduling // Cho phép các tác vụ theo lịch trình dựa trên chú thích
- @SpringBootỨng dụng
- công cộng lớp học Ứng dụng SpringbootTask {
-
- công cộng tĩnh vô hiệu chủ yếu(Sợi dây[] các đối số) {
- Ứng dụng Spring.chạy(Ứng dụng SpringbootTask.lớp học, các đối số);
- }
-
- }
3. Trình tạo biểu cảm.
http://www.bejson.com/othertools/cron/ .
4. Các cách diễn đạt thường dùng.
- (1)0/2 * * * * ? Chỉ ra mỗi2Thứ hai Thực hiện nhiệm vụ
- (1)0 0/2 * * * ? Chỉ ra mỗi2phút Thực hiện nhiệm vụ
- (1)0 0 2 1 * ? Chỉ ra rằng trong mỗi tháng1Sáng sớm trong ngày2Nhấp vào Điều chỉnh nhiệm vụ
- (2)0 15 10 ? * THỨ HAI-Thứ sáu Thứ Hai đến thứ Sáu hàng tuần vào mỗi buổi sáng10:15Thực hiện công việc
- (3)0 15 10 ? 6L 2002-2006 thể hiện2002-2006Sáng thứ sáu cuối cùng của mỗi tháng trong năm10:15Thực hiện
- (4)0 0 10,14,16 * * ? Mỗi buổi sáng1012:00 trưa2điểm,4điểm
- (5)0 0/30 9-17 * * ? Mỗi nửa giờ trong giờ làm việc từ 9 giờ sáng đến 5 giờ chiều
- (6)0 0 12 ? * THỨ TƯ Mỗi thứ tư vào buổi trưa12điểm
- (7)0 0 12 * * ? Mỗi ngày vào buổi trưa12Điểm kích hoạt
- (8)0 15 10 ? * * Mỗi buổi sáng10:15cò súng
- (9)0 15 10 * * ? Mỗi buổi sáng10:15cò súng
- (10)0 15 10 * * ? Mỗi buổi sáng10:15cò súng
- (11)0 15 10 * * ? 2005 2005Mỗi buổi sáng trong năm10:15cò súng
- (12)0 * 14 * * ? Vào mỗi buổi chiều2từ 12:00 đến 15:002:59Trong mỗi1Phút kích hoạt
- (13)0 0/5 14 * * ? Vào mỗi buổi chiều2từ 12:00 đến 15:002:55Trong mỗi5Phút kích hoạt
- (14)0 0/5 14,18 * * ? Vào mỗi buổi chiều2Nhấp để2:55Trong và buổi chiều6Nhấp để6:55Trong mỗi5Phút kích hoạt
- (15)0 0-5 14 * * ? Vào mỗi buổi chiều2từ 12:00 đến 15:002:05Trong mỗi1Phút kích hoạt
- (16)0 10,44 14 ? 3 THỨ TƯ Mỗi chiều thứ tư trong tháng 32:10Và2:44cò súng
- (17)0 15 10 ? * THỨ HAI-Thứ sáu Thứ Hai đến sáng thứ Sáu10:15cò súng
- (18)0 15 10 15 * ? mỗi tháng15Buổi sáng10:15cò súng
- (19)0 15 10 L * ? Buổi sáng ngày cuối cùng của mỗi tháng10:15cò súng
- (20)0 15 10 ? * 6L Sáng thứ sáu cuối cùng của mỗi tháng10:15cò súng
- (hai mươi mốt)0 15 10 ? * 6L 2002-2005 2002ĐẾN2005Sáng thứ sáu cuối cùng của mỗi tháng trong năm10:15cò súng
- (hai mươi hai)0 15 10 ? * 6#3 Kích hoạt lúc 10:15 sáng thứ sáu tuần thứ ba của mỗi tháng
Đây là phần cuối của bài viết này về swagger, tác vụ asynchronous/timing/mail trong springboot. Để biết thêm nội dung springboot swagger có liên quan, vui lòng tìm kiếm các bài viết trước của tôi hoặc tiếp tục duyệt các bài viết liên quan sau. Tôi hy vọng bạn sẽ ủng hộ tôi trong tương lai! .
Liên kết gốc: https://blog.csdn.net/qq_30081043/article/details/108913995.
Cuối cùng, bài viết này về swagger, các vấn đề về tác vụ asynchronous/timing/mail trong springboot kết thúc tại đây. Nếu bạn muốn biết thêm về swagger, các vấn đề về tác vụ asynchronous/timing/mail trong springboot, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!