lo que es mejor un buen enlace de servicio/práctica de la comunicación en el siguiente escenario (espero que el título es algo significativo) /:Las mejores prácticas para la comunicación asíncrona entre los servicios
Una capa de negocio (BL) que comprende varios métodos de servicio que comparten (como extremo de comunicación común) un servicio de socket asíncrono (SS) que puede estar vinculado por esos métodos y usarse para socket IO.
E.g. el BL agarra SL e invoca enviar (mensaje) y luego espera una respuesta.
He utilizado devoluciones de llamada y el patrón de encuadernación al principio. Como tenía algunos problemas con un diseño claro con el patrón de encuadernación (falta de una cola de mensajes y todo lo hecho en el hilo principal), ahora estoy intentando el patrón de mensaje.
Así que, básicamente, los servicios BL y el servicio SL tienen ahora un mensajero y un controlador correspondiente:
private final IncomingHandler incomingHandler = new IncomingHandler();
private final Messenger messengerReceiver = new Messenger(incomingHandler);
private class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
...
}
}
Uno del BLS es una subclase AbstractAccountAuthenticator implementar
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);
...}
que también utiliza el SL para obtener el authToken. El método addAccount() requiere devolver el resultado (el authToken) inmediatamente en un paquete o llamar a los métodos de devolución de llamada de respuesta. Ahora, si solicito el token de autenticación dentro de addAccount a través de SL, ¿cómo me las arreglaré para devolver el resultado?
El principal problema aquí es que el resultado no se devuelve al método de llamada (addAccount()) sino al manejador de messengerReceiver.
La única forma en que podría pensar es en un BlockingQueue al que se le ofrece la respuesta del manejador de mensajes y que luego se toma dentro del método addAccount() pero esto realmente se siente de manera uberugly. ¿Otras ideas? Enfoque correcto en absoluto?