Hello anh , cảm ơn anh về những chia sẻ rất hay về SAGA nhưng em muốn hỏi anh chút về Outbox ạ mong anh rep , hí hí
Trong bài toán của anh nếu là đến đoạn payment xử lý cắt tiền xong gửi msg cho order thì bị lỗi thì bên order ko nhận dc msg nên ko update dc status nên mình đã xử dụng outbox , chỗ này theo em chia làm 2 trường hợp
TH1 : hàm của anh có đánh transactional thì mà giả xử trong hàm đó xảy ra bất kì 1 lỗi throws exception nào thì nó không update status của payment dc và cũng ko lưu data xuống outbox để publish msg dc ạ -> cũng mất msg ( expect của mình ở đây là phải trả về msg FAILED )
TH2: hàm của anh không đánh transactional thì oke vấn đề ở TH1 dc giải quyết = cách try catch nó , nhưng vấn đề khi ko đánh transactional xảy ra đó là nó ko rollback data dc tại service payment . Nhưng thế thì cũng có cách tự rollback thủ công nhưng vấn đề em băn khoăn ở đây là nó đã save data xuống những bảng nào để mình có thể rollback ạ , ví dụ em có đoạn code sau trong 1 function ạ
dòng 1 : xảy ra exception
dòng 2 : save data vào database table payment entity
ở đây mình có thể trycatch để gửi lại msg FAILED cho order nhưng mình cũng phải biết nó đã save ở đâu mà còn rollback anh ạ nếu bên payment service vẫn lắng nghe msg FAIL từ order service gửi lại để rollback thì em nghĩ có vẻ sẽ xảy ra lỗi khi mà thực sự data chưa dc save vào table payment mà mình vẫn cứ update thì ko hợp lý lắm
Vấn đề của em cũng hơi dài rồi , cảm ơn anh và mong anh rep ạ
Khi test method PUT thì bị lỗi thiếu tham số id, vì trong code, hàm cập nhật (PUT method) sử dụng đầu vào là @PathVariable(value = "id") nên chỗ annotation
@RequestMapping(value = "/contact/", method = RequestMethod.PUT) phải sửa thành @RequestMapping(value = "/contact/{id}", method = RequestMethod.PUT) , value như hàm lấy một contact thì mới chạy được. Cách khác các bạn có thể sửa t@PathVariable(value = "id") thành @RequestParam(value = "id"). Sau đó khi test các bạn chọn tab params và thêm entry có key là "id" và value là "<id contact bạn muốn sửa>" lúc đó path sẽ dạng như thế này: "api/contact/?id=7". Một cách nữa là bỏ tham số đầu vào id nhưng khi nhận một contact từ client dạng body trong đó có thể nhận thộc tính id thì ta sẽ lấy id đó để nhận diện được là sửa contact nào như vậy code bên trong hàm method PUT sẽ cần lấy id từ cái body ra (thêm mới 1 dòng: "long id = contactForm.getId();" sau đó sửa dòng "Contact contact = contactService.getOne(contactId);" thành "Contact contact = contactService.getOne(id);" sẽ chạy được.
Các method còn lại thì làm theo hướng dẫn video mình để link ở trên thì vẫn chạy bình thường.
bạn có thể chọn mount tất cả ở docker-compose nhưng như thế thì trong container của bạn sẽ nhiều thứ, nặng, ko cần thiết. Thay vào đó ta nên linh hoạt, các thành phần nào cần thiết để chạy được appp thì nên để ở Dockerfile với COPY/ADDD (source code chẳng hạn), còn các thành phần mà bạn muốn giữ/lưu lại (persist) kể cả khi container bị khởi động lại thì ta cho vào volume (ví dụ: ảnh, file,....)
THẢO LUẬN
Hello anh , cảm ơn anh về những chia sẻ rất hay về SAGA nhưng em muốn hỏi anh chút về Outbox ạ mong anh rep , hí hí
không chạy được @_@
Các bạn có thể xem hướng dẫn test các phương thức còn lại ở nguồn dưới: https://www.youtube.com/watch?v=fsWEqTa_MGg
Lưu ý:
Khi test method POST thì phải sửa annotation @GeneratedValue(strategy=GenerationType.AUTO) thành @GeneratedValue(strategy = GenerationType.IDENTITY) link tham khảo fix (https://stackoverflow.com/questions/49813666/table-dbname-hibernate-sequence-doesnt-exist)
Khi test method PUT thì bị lỗi thiếu tham số id, vì trong code, hàm cập nhật (PUT method) sử dụng đầu vào là @PathVariable(value = "id") nên chỗ annotation @RequestMapping(value = "/contact/", method = RequestMethod.PUT) phải sửa thành @RequestMapping(value = "/contact/{id}", method = RequestMethod.PUT) , value như hàm lấy một contact thì mới chạy được. Cách khác các bạn có thể sửa t@PathVariable(value = "id") thành @RequestParam(value = "id"). Sau đó khi test các bạn chọn tab params và thêm entry có key là "id" và value là "<id contact bạn muốn sửa>" lúc đó path sẽ dạng như thế này: "api/contact/?id=7". Một cách nữa là bỏ tham số đầu vào id nhưng khi nhận một contact từ client dạng body trong đó có thể nhận thộc tính id thì ta sẽ lấy id đó để nhận diện được là sửa contact nào như vậy code bên trong hàm method PUT sẽ cần lấy id từ cái body ra (thêm mới 1 dòng: "long id = contactForm.getId();" sau đó sửa dòng "Contact contact = contactService.getOne(contactId);" thành "Contact contact = contactService.getOne(id);" sẽ chạy được.
Các method còn lại thì làm theo hướng dẫn video mình để link ở trên thì vẫn chạy bình thường.
Chúc các bạn code vui vẻ.
thanks
@5ting4U nó tuỳ nhé bạn,
bạn có thể chọn mount tất cả ở docker-compose nhưng như thế thì trong container của bạn sẽ nhiều thứ, nặng, ko cần thiết. Thay vào đó ta nên linh hoạt, các thành phần nào cần thiết để chạy được appp thì nên để ở Dockerfile với COPY/ADDD (source code chẳng hạn), còn các thành phần mà bạn muốn giữ/lưu lại (persist) kể cả khi container bị khởi động lại thì ta cho vào volume (ví dụ: ảnh, file,....)
Mỗi tội anh viết sai chính tả rồi anh ơi, Docker chứ không phải là Doker a nhé!
@trainee Bạn chú ý trường hợp ví dụ như bạn search là CON BÒ thì kết quả là CON BỌ nó vẫn ra nhé.
Bài viết xịn quá ạ, mong anh ra nhiều bài viết hay và bổ ích như vậy trong tương lai. 🤤🥲🥲🥲🫠🫠
cảm ơn anh nhé
cám ơn bạn nhiều lắm, đúng cái mình cần đây rồi🙂
Thank E nhiều, bài viết quá hay và tuyệt vời
sao mình push lên heroku versoin 5.8 lần này thỉ bị lỗi này
,mấy lần trước up lên không bị
@thevan96 Yup! Mình thường hay dùng WezTerm, nhanh mượt, config vất vả hơn chút bù lại render ổn hơn HyperJS
GG dịch còn k buồn xóa TA đi
@Anhkolamgidauanhthe không có gì bác ơi.
Ai cũng từng là những người mới =))) Ngu và ngơ ngác :3 Đọc bài của bác nhớ mình hồi mới ra trường
mình làm như các bước nhưng khi vào trang admin thì nó không tự động add boostrap cho mình
Bài viết hay và đầy đủ quá. Cảm ơn bạn đã chia sẻ.
Chúc một ngày làm việc tốt lành 👍️
Cảm ơn bạn.
Quarkus thi truong vn hau nhu khong thay nhieu nhi