2010-03-20 63 views
8

Tôi có một ứng dụng có kiến ​​trúc máy chủ khách. Máy khách sử dụng Java Web Start với Java Swing/AWT và sert sử dụng máy chủ HTTP/Servlet với Tomcat. Giao tiếp được thực hiện từ việc tuần tự hóa các đối tượng, tạo một đối tượng ObjectOutput tuần tự hóa một mảng byte và gửi đến máy chủ tương ứng được gọi là ObjectInputStream và deserializes.java.net.SocketTimeoutException: Đọc hết thời gian

Ứng dụng sau giao tiếp chính xác với một số thời gian nhất định khi bắt đầu hiển thị lỗi "SocketException read timeout". Các erro xảy ra khi máy chủ gọi phương thức ObjectInputStream.getObject() trong phương thức doPost servlet của tôi.

Tomcat sẽ chạy chậm và các lỗi bắt đầu giảm thời gian phản hồi của máy chủ cho đến thời gian xảy ra sự cố khi tôi phải khởi động lại máy chủ và sau khi mọi thứ hoạt động.

Ai đó đã gặp phải vấn đề này?

Mã khách hàng

URLConnection conn = url.openConnection(); 
conn.setDoOutput(true); 

OutputStream os = conn.getOutputStream(); 
ObjectOutputStream oss = new ObjectOutputStream(os); 

oss.writeUTF("protocol header sample"); 

oss.writeObject(_parameters); 
oss.flush(); 
oss.close(); 

Máy chủ Mã

ObjectInputStream input = new ObjectInputStream(_request.getInputStream()); 
String method = input.readUTF(); 

parameters = input.readObject(); 

input.readObject() là nơi mà các lỗi là

+0

Bạn có thể đăng một số mã không? – Enrique

+0

Đó là tham số linux tcp? Giống như kích thước bộ nhớ đệm, tệp mở tối đa hoặc tệp khác? –

+0

Lượng thời gian trôi qua trước SocketException 20 phút hoặc lâu hơn? (nếu tôi nhớ lại khoảng thời gian tiêu chuẩn, một ổ cắm tcp/ip sẽ đợi trước khi hết thời gian nếu không có hoạt động kết nối)? Sau khi tất cả các ngoại lệ là nói cho bạn "read timeout" cũng có thể điều này có cái gì để làm với bản chất không đồng bộ của web? – Wintermut3

Trả lời

10

Bạn chưa cho chúng ta nhiều thông tin để tiếp tục, đặc biệt là về phía khách hàng. Nhưng sự nghi ngờ của tôi được rằng phía khách hàng là:

  • thất bại trong việc thiết lập các tiêu đề Content-length (hoặc cài đặt nó vào giá trị sai),
  • không để tuôn ra những dòng đầu ra, và/hoặc
  • không đóng đầu ra của ổ cắm.

Bí ẩn.

Dựa trên câu hỏi được cập nhật của bạn, có vẻ như không có câu nào ở trên. Dưới đây là một vài khả năng khác:

  • Vì lý do nào đó, phía máy khách bị khóa hoàn toàn trong quá trình tuần tự hoặc mất một thời gian RẤT LONG.
  • Có một proxy giữa máy khách và máy chủ đang gây ra sự cố.
  • Bạn đang gặp sự cố mạng liên quan đến tải hoặc sự cố phần cứng mạng.

Một lời giải thích có thể là bạn có một rò rỉ bộ nhớ, và đó là sự suy giảm là do GC tham gia ngày càng nhiều thời gian khi bạn chạy ra khỏi bộ nhớ. Điều này sẽ hiển thị trong nhật ký GC nếu bạn đã bật chúng.

0

Tôi nghĩ Trong thời gian tương tranh cao, thời gian chờ của Socket được cài đặt trong Tomcat sẽ hết hạn và kết nối sẽ bị đóng. Lần đọc tiếp theo của Tomcat cho kết nối đó lớn hơn thời gian chờ của máy chủ được chỉ định trong máy chủ.
Nếu bạn muốn tránh sự cố này, bạn phải tăng thời gian chờ ở phía máy chủ đã hết hạn trong trường hợp của bạn. Nhưng không nên.
BTW bạn không cung cấp đủ thông tin. Bạn đã tăng không có chủ đề cho kết nối trong Tomcat? Nếu bạn đã làm, điều này chắc chắn sẽ xảy ra.

Các vấn đề liên quan