2011-11-28 19 views
15

Chúng tôi chỉ phát hiện ra rằng mỗi khi chúng tôi khởi động lại JBoss, tất cả các máy khách Java Web Start của chúng tôi đều tải xuống tất cả các lọ của chúng, thay vì sử dụng lại các lọ đã lưu trong bộ nhớ cache, ngay cả khi ứng dụng của chúng tôi không thay đổi.Tại sao Java Web Bắt đầu tải lại các lọ từ JBoss?

Từ những gì tôi đã thấy trên web, Java Web Start thực hiện HEAD HTTP để quyết định có tải xuống một cái bình hay không. Vì vậy, tôi chạy HTTP HEAD trên tất cả các lọ trong ứng dụng của chúng tôi, và phát hiện ra rằng sau khi khởi động lại JBoss, thời gian sửa đổi của tất cả các lọ đã thay đổi!

Tại sao điều này và cách khắc phục? Các lọ bên trong kho lưu trữ ứng dụng của tôi không hề thay đổi. Như gần như tôi có thể nói, JBoss sử dụng thời gian khởi động hoặc thời gian triển khai như thời gian sửa đổi. Điều này sẽ hoàn toàn ngắn mạch Java Web Start khả năng sử dụng các lọ được lưu trong bộ nhớ cache từ các lần chạy trước, nếu tôi hiểu chính xác.

Chúng tôi sử dụng JBoss 6, nếu đó là vấn đề. Trước đây chúng tôi sử dụng JBoss 4. Tôi muốn kiểm tra xem chúng tôi đã có vấn đề theo JBoss 4, nhưng bây giờ chúng tôi có rất nhiều phụ thuộc vào JBoss mới hơn rằng nó sẽ mất một số công việc để làm cho thử nghiệm đó xảy ra.

+0

Bạn đã thử thiết lập Tomcat bên ngoài JBoss và đưa ứng dụng webstart của bạn lên đó chưa? Chuyện gì xảy ra? Liệu nó báo cáo thời gian khác nhau sau khi bạn tắt tomcat? – chubbsondubs

Trả lời

3

Thử triển khai ứng dụng của bạn dưới dạng ứng dụng web đã phát nổ thay vì tệp WAR.

Điều đó sẽ ngăn JBoss phải giải nén ứng dụng và có khả năng làm hỏng ngày sửa đổi.

Bạn sẽ phải xử lý cập nhật cho ứng dụng của mình theo cách bảo tồn ngày sửa đổi, ví dụ: rsync, nhưng điều đó có thể dễ dàng hơn việc hạ cấp hoặc vá JBoss.

+0

Chà, tôi không chắc JBoss đang làm gì với tai và chiến tranh phát nổ của tôi, nhưng phải mất ba phút mà không nói bất cứ điều gì, sau đó ném một ngoại lệ khi nó chạy ra khỏi không gian permgen! – skiphoppy

+0

Đối với một số phiên bản của JBoss, tên thư mục đã phát nổ phải kết thúc bằng '.war' hoặc' .ear' khi thích hợp. Bạn đang làm điều đó? – blahdiblah

+0

Không, tôi đã mắc phải một số sai lầm ngu ngốc khác mà tôi đã chỉnh sửa sáng nay - và hóa ra công việc này! Cảm ơn bạn vì một giải pháp đơn giản và súc tích! :) – skiphoppy

2

Có vẻ như VFSUtils không duy trì lastModifiedDate của tệp khi nó gắn hệ thống tệp vào thư mục tmp khi khởi động máy chủ. Bạn có thể vá các phương thức sao chép trong lớp đó để cố gắng đặt dấu thời gian của tệp mới dựa trên các giá trị từ tệp vật lý.

Để trả lời nhận xét của chubbard: vấn đề không xảy ra với Tomcat (tomcat 7.0.21 là chính xác).

0

Có sự cố (https://issues.jboss.org/browse/JBVFS-177) được tạo về VFSUtils.unzip() không giữ dấu thời gian trong khi triển khai (vẫn áp dụng cho JBoss 6.1).

Vì vấn đề này liên quan đến phương pháp giải nén, giải pháp của blahdiblah thực sự có thể hoạt động.

Một cách khác là sử dụng Java Web Start với phiên bản dựa trên (Sửa đổi jnlp bằng versionEnabled và tạo tệp version.xml).