Was im folgenden Szenario am besten/guter Service Bindung/Kommunikation Praxis ist (ich hoffe, der Titel etwas sinnvoll ist):Best Practice für Async-Kommunikation zwischen den Diensten
Eine Business-Schicht (BL) mehrere Service-Methoden umfasst, die gemeinsam nutzen (als gemeinsamer Kommunikationsendpunkt) ein asynchroner Socket-Dienst (SS), der an diese Methoden gebunden sein kann und für Socket-IO verwendet wird.
z. der BL ergreift SL und ruft send (Nachricht) auf und wartet dann auf eine Antwort.
Ich verwendete Callbacks und das Binder-Muster zuerst. Da ich Probleme mit einem klaren Design hatte, das das Bindemuster verwendet (Fehlen einer Nachrichtenwarteschlange und alles, was im Hauptthread erledigt wurde), versuche ich jetzt das Nachrichtenmuster.
Also im Grunde, BL Dienstleistungen und der SL-Service haben jetzt eine Messenger und einen entsprechenden Handler:
private final IncomingHandler incomingHandler = new IncomingHandler();
private final Messenger messengerReceiver = new Messenger(incomingHandler);
private class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
...
}
}
Einer des BLs ist eine AbstractAccountAuthenticator Unterklasse
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);
...}
Implementierung, die auch die SL verwendet um den authToken zu erhalten. Die addAccount() -Methode erfordert entweder, das Ergebnis (das authToken) sofort in einem Bundle zurückzugeben oder stattdessen die Antwort-Callback-Methoden aufzurufen. Wenn ich jetzt das Authentifizierungs-Token in addAccount via SL anfrage, wie würde ich dann das Ergebnis zurückgeben?
Das Hauptproblem hierbei ist, dass das Ergebnis nicht an die aufrufende Methode (addAccount()) zurückgegeben wird, sondern an den MessengerReceiver-Handler.
Der einzige Weg, an den ich denken könnte, ist eine BlockingQueue, die die Antwort vom Message-Handler angeboten wird und die dann innerhalb der addAccount() -Methode genommen wird, aber das fühlt sich wirklich überheblich an. Andere Ideen? Richtiger Ansatz überhaupt?