Co jest najlepsze/dobra obsługa wiązania/praktyka komunikacji w następującym scenariuszu (mam nadzieję, że tytuł jest dość wymowny):Najlepsze praktyki dla komunikacji asynchronicznej pomiędzy służbami
Warstwa biznesowych (BL) zawiera kilka metod serwisowego akcję (jako wspólny punkt końcowy komunikacji) asynchroniczna usługa gniazda (SS), która może być związana tymi metodami i używana dla gniazda IO.
E.g. BL pobiera SL i wywołuje send (wiadomość), a następnie czeka na odpowiedź.
Najpierw użyłem wywołań zwrotnych i wzoru segregatora. Ponieważ miałem pewne problemy z wyraźnym projektem wykorzystującym wzorzec segregatorów (brak kolejki komunikatów i wszystkiego, co robi główny wątek), teraz próbuję wzorca komunikatu.
Więc w zasadzie, usługi BL i obsługa SL mają teraz Messenger i odpowiedniej obsługi:
private final IncomingHandler incomingHandler = new IncomingHandler();
private final Messenger messengerReceiver = new Messenger(incomingHandler);
private class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
...
}
}
Jednym z BLS jest podklasą AbstractAccountAuthenticator realizacji
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);
...}
który również używa SL aby uzyskać authToken. Metoda addAccount() wymaga natychmiastowego zwrócenia wyniku (authToken) w pakiecie lub w celu wywołania metod zwrotnych odpowiedzi. Teraz, jeśli zażądam tokena autoryzacji wewnątrz funkcji addAccount za pośrednictwem SL, jak mogę obsłużyć, aby przekazać wynik ponownie?
Głównym problemem jest to, że wynik nie jest zwracany do metody wywołania (addAccount()), ale do obsługi programu messengerReceiver.
Jedyny sposób, jaki mogłem wymyślić, to BlockingQueue, w którym oferowana jest odpowiedź przez program obsługi komunikatów, a który jest następnie pobierany wewnątrz metody addAccount(), ale to naprawdę wydaje się uciążliwe. Inne pomysły? Właściwe podejście w ogóle?