Tôi có một ứng dụng bao gồm hai quy trình, một quá trình khách hàng với GUI (dựa trên SWT) và một quy trình máy chủ. Quá trình khách hàng rất nhẹ, có nghĩa là rất nhiều hoạt động GUI sẽ phải truy vấn quá trình máy chủ hoặc yêu cầu nó đến một cái gì đó, ví dụ như để phản hồi người dùng nhấp vào một nút hoặc chọn một mục menu. Điều này có nghĩa rằng sẽ có rất nhiều xử lý sự kiện trông như thế này:Mẫu cho dòng yêu cầu đáp ứng với các lớp bên trong
// Method invoked e.g. in response to the user choosing a menu item
void execute(Event event) {
// This code is executed on the client, and now we need some info off the server:
server.execute(new RemoteRequest() {
public void run() {
// This code is executed on the server, and we need to update the client
// GUI with current progress
final Result result = doSomeProcessing();
client.execute(new RemoteRequest() {
public void run() {
// This code is again executed on the client
updateUi(result);
}
}
}
});
}
Tuy nhiên, kể từ khi server.execute
ngụ ý một serialization (nó được thực hiện trên một máy từ xa), mô hình này là không thể không làm cho toàn bộ lớp serializable (kể từ khi các lớp bên trong RemoteRequest
không tĩnh (chỉ cần được rõ ràng: nó không phải là một yêu cầu rằng việc thực hiện Request
có thể truy cập vào trường hợp cha mẹ, vì lợi ích của ứng dụng mà họ có thể là tĩnh)
Tất nhiên , một giải pháp là tạo các lớp riêng biệt (có thể là bên trong tĩnh) cho Yêu cầu và Phản hồi, nhưng điều này làm tổn thương khả năng đọc và làm cho nó khó hơn xóa luồng thực hiện.
Tôi đã cố gắng tìm bất kỳ mẫu chuẩn nào để giải quyết vấn đề này, nhưng tôi không tìm thấy bất kỳ điều gì trả lời mối quan tâm của tôi về khả năng đọc.
Để rõ ràng, sẽ có rất nhiều hoạt động này và hoạt động thường khá ngắn. Lưu ý rằng các đối tượng Future
không hoàn toàn hữu ích ở đây, vì trong nhiều trường hợp, một yêu cầu tới máy chủ sẽ cần phải thực hiện nhiều thứ trên máy khách (thường thay đổi) và nó cũng không phải lúc nào cũng được trả về.
Lý tưởng nhất, tôi muốn để có thể viết mã như thế này: (rõ ràng pseudo-code bây giờ, xin vui lòng bỏ qua các lỗi rõ ràng trong chi tiết)
String personName = nameField.getText();
async exec on server {
String personAddress = database.find(personName);
async exec on client {
addressField.setText(personAddress);
}
Order[] orders = database.searchOrderHistory(personName);
async exec on client {
orderListViewer.setInput(orders);
}
}
Bây giờ tôi muốn được rõ ràng, rằng tiềm ẩn kiến trúc được đặt ra và hoạt động tốt, lý do giải pháp này là có tất nhiên không phải là ví dụ trên. Điều duy nhất tôi đang tìm kiếm là một cách để viết mã như trên, mà không cần phải định nghĩa các lớp tĩnh cho mỗi quá trình chuyển đổi. Tôi hy vọng rằng tôi không chỉ làm phức tạp mọi thứ bằng cách đưa ra ví dụ này ...
Điều này liên quan đến jms như thế nào? Mã này có được thực thi trên máy khách hoặc máy chủ hoặc máy khác không? – Andrejs
Vâng, đúng thế. Có những trường hợp mã được thực hiện trên máy khách và trên máy chủ. Ngoài ra còn có những trường hợp máy khách thực hiện một cái gì đó trên máy chủ mà lần lượt thực hiện một cái gì đó trên máy khách. – Krumelur
Tôi nghĩ chúng ta cần thêm một chút chi tiết. Yêu cầu/đáp ứng các lớp học của riêng bạn hoặc chúng là một phần của một số khuôn khổ? Chính xác những gì thực hiện không? – Andrejs