Bagaimana cara memperbarui aplikasi web Tomcat tanpa memulai ulang seluruh layanan?

93

Saya baru mengenal Tomcat. Kami memiliki mesin dev dengan sekitar 5 aplikasi yang berjalan. Meskipun itu dev, ini digunakan oleh klien kami cukup banyak selama pengujian.

Jadi katakanlah kita perlu membuat satu perubahan kecil pada satu file kelas. Saat ini, kami harus mematikan Tomcat (memengaruhi empat aplikasi lainnya), menghapus WARfile (dan direktori aplikasi web), menerapkan ulang WARfile baru, dan memulai ulang Tomcat.

Tentu saja, ini mengganggu beberapa orang karena menghancurkan semua sesi yang masuk untuk semua aplikasi.

Apakah ada cara yang lebih baik untuk melakukan ini? Maksud saya, apakah ada cara untuk hanya memuat ulang CLASS yang berubah, bukan semua yang ada di mesin dev?

Terima kasih.

cbmeeks.dll
sumber
Ubah manajemen sesi Anda menjadi sesuatu yang tetap ada di file? Maaf tidak bisa menahan :)
rogerdpack
1
@rogerdpack Saya telah belajar banyak tentang Tomcat sejak saya mengajukan pertanyaan ini lebih dari enam tahun yang lalu. Tapi Terimakasih.
cbmeeks
Mengenai kelas hot swapping saja, lihat stackoverflow.com/questions/32459047/…
rogerdpack

Jawaban:

59

Sudahkah Anda mencoba menggunakan aplikasi Manajer Tomcat ? Ini memungkinkan Anda untuk membatalkan penyebaran / menyebarkan file perang tanpa mematikan Tomcat.

Jika Anda tidak ingin menggunakan aplikasi Manajer, Anda juga dapat menghapus file perang dari direktori webapps, Tomcat akan membatalkan penerapan aplikasi setelah beberapa saat. Anda kemudian dapat menyalin file perang kembali ke direktori, dan Tomcat akan menerapkan file perang tersebut.

Jika Anda menjalankan Tomcat di Windows, Anda mungkin perlu mengkonfigurasi Konteks agar tidak mengunci berbagai file.

Jika Anda benar-benar tidak dapat mengalami downtime, Anda mungkin ingin melihat Penerapan Paralel Tomcat 7. Anda dapat menerapkan beberapa versi aplikasi web dengan jalur konteks yang sama pada waktu yang sama. Aturan yang digunakan untuk mencocokkan permintaan dengan versi konteks adalah sebagai berikut:

  • Jika tidak ada informasi sesi dalam permintaan, gunakan versi terbaru.
  • Jika informasi sesi ada dalam permintaan, periksa manajer sesi dari setiap versi untuk sesi yang cocok dan jika ada, gunakan versi itu.
  • Jika informasi sesi ada dalam permintaan tetapi tidak ada sesi yang cocok dapat ditemukan, gunakan versi terbaru.
Steve K
sumber
Itu juga saran yang bagus. Saya tidak pernah mendengar tentang aplikasi manajer hingga hari ini. Ya, kami menggunakan Windows. Satu masalah yang saya miliki dengan menghapus file WAR dan menunggu adalah klien kami sering mengharapkan "perbaikan kecil". Akankah saran-saran itu berhasil untuk skenario itu?
cbmeeks
1
@cbmeeks - Tergantung seberapa sering perbaikan kecil ini terjadi, dan berapa lama sebelum seseorang menyadarinya. Dalam kedua kasus tersebut, akan ada sedikit waktu ketika aplikasi tidak tersedia. Itu tergantung pada perangkat keras / aplikasi Anda berapa lama waktu itu. Tapi itu diukur dalam hitungan detik, biasanya 5-10 pada aplikasi kami. Tapi jarak tempuh Anda mungkin berbeda :)
Steve K
1
Wow. Saya telah belajar banyak sejak saya menanyakan pertanyaan ini. Ya, kami sekarang menerapkan aplikasi Tomcat tanpa menghapus Tomcat sepenuhnya. Satu hal yang saya lakukan adalah memastikan semua logging (aplikasi dan Tomcat) tidak merekam log DI DALAM folder webapps / aplikasi. Atau, mengonfigurasi Tomcat agar tidak mengunci juga berfungsi. Jadi kami meletakkan logging di tempat sentral di luar folder Tomcat. Bekerja seperti mimpi. Tetapi jawaban Anda adalah yang paling membantu. Terima kasih!
cbmeeks
5
Saat menerapkan ulang tanpa memulai ulang, Anda harus berhati-hati dengan kebocoran memori - sering kali pemuat kelas akan membocorkan referensi dan Anda perlu memulai ulang seluruh proses Tomcat untuk mengosongkan memori dari versi lama aplikasi. LiveRebel (disebutkan di jawaban lain) dapat mengotomatiskan semua itu untuk Anda.
Neeme Praks
3
Anda tidak perlu menghapus perang untuk menerapkan ulang. Cukup salin perang lama dan tunggu beberapa detik.
peceps
31

Ada beberapa cara mudah.

  1. Cukup sentuh web.xml dari aplikasi web apa pun.

    touch /usr/share/tomcat/webapps/<WEBAPP-NAME>/WEB-INF/web.xml
    

Anda juga dapat memperbarui file jar tertentu di WEB-INF / lib dan kemudian menyentuh web.xml, daripada membuat seluruh file perang dan menerapkannya lagi.

  1. Hapus direktori webapps / YOUR_WEB_APP, Tomcat akan mulai menyebarkan perang dalam 5 detik (dengan asumsi file perang Anda masih ada di folder webapps).

  2. Umumnya menimpa file perang dengan versi baru akan diterapkan ulang oleh tomcat secara otomatis. Jika tidak, Anda dapat menyentuh web.xml seperti yang dijelaskan di atas.

  3. Salin "direktori" yang sudah meledak ke folder webapps Anda

Chirag Katudia
sumber
1
Berguna untuk mengetahui bahwa metode 'sentuh' tidak memuat ulang kelas. IOW, itu tidak membersihkan dan memuat ulang hierarki classloader untuk aplikasi web
Rondo
2
Melihat mengapa ini berhasil dapat dibaca $CATALINA_BASE/conf/context.xml. WEB-INF / web.xml dipantau untuk perubahan. Sumber daya lain dapat dengan mudah dicantumkan di sana sesuai kebutuhan.
Kevin
21

Di direktori conf apache tomcat Anda dapat menemukan file context.xml. Dalam tag edit itu sebagai < Context reloadable = "true" >. ini seharusnya menyelesaikan masalah dan Anda tidak perlu memulai ulang server

skal
sumber
Lebih suka aplikasi manajer sebagai gantinya. Ini adalah operasi yang mahal untuk domba jantan itu.
Penyortir