วันพฤหัสบดี, มิถุนายน 11, 2558

ทำ Spring Boot ให้สร้าง PID file ตอนรัน executable jar/war (Another way to config ApplicationPidFileWriter in Spring Boot)

เมื่อเราทำ executable jar หรือ executable war เวลารันไฟล์เหล่านี้ มันก็จะไม่ได้เปิดหรือแสดง console การที่จะหยุดการทำงานมัน เราจะต้องรู้ process id ของมัน
วิธีหา process id ของ executable jar/war ก็มีหลายวิธี
  • ใช้ command line `ps -ef|grep {ชื่อ file ของเรา}
  • เปิด log file ดู (ถ้า config พวก log4j เอาไว้) เวลา SpringApplication เริ่มทำงานมันก็จะบอกว่า process id ที่มันได้คือเลขอะไร i.e.: ...Starting FooApplication v0.1.0 on dahoba-laptop with PID 15840 ...
  • ใช้ Spring Boot Actuator ให้มันสร้าง pid ไฟล์ให้เรา
อ้างอิงตาม Spring Boot 1.2.3.RELEASE หัวข้อ Process monitoring เค้าบอกว่า ApplicationPidFileWriter สามารถจะเขียน application.pid ซึ่งมีเลข PID (process id) ของ application ที่รันอยู่ให้เราได้
วิธีการทำ
  • ใส่ dependency Spring Boot Actuator ก่อน
    reference #39
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>
Note: วิธี extend META-INF/spring.factories ยังทำให้ผมสับสน หรือใช้ SpringApplication.addListeners(…​) มันไม่ work แฮะ (ผมยังใช้ไม่เป็น :-( )
ผมทำแบบนี้ ใช้ได้เหมือนกัน
  • สร้างไฟล์ application.properties ขึ้นมาใน classpath i.e.: src/main/resources/application.properties
  • เพิ่ม line context.listener.classes นี้เข้าไป
  • ทางขวา value เป็น comma separate ใส่ class อื่นๆ ได้อีก
... 
context.listener.classes = org.springframework.boot.actuate.system.ApplicationPidFileWriter
... 
ที่นี้พอ execute jar/war ที่ package ใหม่หลังจาก ใส่ properties กับ dependency เข้าไปแล้ว มันก็จะสร้าง application.pid ให้เราแล้ว
มันจะถูกสร้างข้างๆไฟล์ jar/war ของเราเลย
$ cat applicaion.pid
19489%
ถ้าใช้ OS เป็น OSX หรือ linux ก็สามารถใช้คำสั่งแบบนี้เพื่อหยุด app ของเราได้เลย
$ kill `cat application.pid| awk '{print;}'`
หรือ
$ kill $(cat application.pid| awk '{print;}')

Happy Coding ^^
Written with StackEdit.

ไม่มีความคิดเห็น :