Thực tiễn tốt nhất/liên kết dịch vụ/truyền thông tốt trong kịch bản sau (Tôi hy vọng tựa đề có phần có ý nghĩa):Thực hành tốt nhất cho giao tiếp không đồng bộ giữa các dịch vụ
Một lớp nghiệp vụ (BL) bao gồm một số phương pháp dịch vụ chia sẻ (như điểm cuối giao tiếp chung) một dịch vụ socket không đồng bộ (SS) có thể bị ràng buộc bởi các phương thức đó và được sử dụng cho socket IO.
Ví dụ: BL lấy SL và gọi gửi (tin nhắn) và sau đó chờ đợi một phản ứng.
Tôi đã sử dụng gọi lại và mẫu liên kết lúc đầu. Như tôi đã có một số vấn đề với một thiết kế rõ ràng bằng cách sử dụng mẫu liên kết (thiếu hàng đợi thông điệp và mọi thứ được thực hiện trong chuỗi chính), tôi hiện đang thử mẫu tin nhắn.
Vì vậy, về cơ bản, dịch vụ BL và dịch vụ SL bây giờ có một Messenger và một handler tương ứng:
private final IncomingHandler incomingHandler = new IncomingHandler();
private final Messenger messengerReceiver = new Messenger(incomingHandler);
private class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
...
}
}
Một trong những BLS là một lớp con AbstractAccountAuthenticator thực hiện
addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options){
...
if(socketConnectionState != null){
Bundle authBundle = new Bundle();
authBundle.putString("password", password);
authBundle.putString("username", account.name);
Message message = Message.obtain(null, SocketConnectionHandler.SEND_REQUEST, authBundle);
message.replyTo = messengerReceiver;
socketConnectionState.getMessenger().send(message);
...}
cũng sử dụng SL để có được authToken. Phương thức addAccount() hoặc yêu cầu trả về kết quả (authToken) ngay lập tức trong một Bundle hoặc để gọi phương thức gọi lại phản hồi thay thế. Bây giờ nếu tôi yêu cầu mã thông báo xác thực bên trong addAccount qua SL, tôi sẽ xử lý như thế nào để trả lại kết quả?
Vấn đề chính ở đây là kết quả không được trả về phương thức gọi (addAccount()) mà là cho trình xử lý messengerReceiver.
Cách duy nhất tôi có thể nghĩ là một BlockingQueue được cung cấp phản hồi bởi trình xử lý tin nhắn và sau đó được đưa vào bên trong phương thức addAccount() nhưng điều này thực sự cảm thấy uberugly. Các ý tưởng khác? Phương pháp tiếp cận đúng?