(Viene de la página anterior)
Página anterior | ![]() Volver al principio del trabajo | Página siguiente ![]() |
La figura muestra el diagrama de componentes del patrón CallBack
En la figura del diagrama se muestra la secuencia del patrón CallBack
Este patrón impone algunos requerimientos básicos en el cliente y en el servidor:

La mayor ventaja del patrón Callback es la mejora en la eficiencia del sistema especialmente en el rendimiento del servidor. La mayoría de mejoras se pueden ver en dos áreas distintas:
Esa es precisamente la mayor motivación para utilizar el patrón CallBack en los sistemas. En los casos más extremos, puede significar la diferencia entre tener un grupo de servidores en paralelo y utilizar una maquina para atender las peticiones de los clientes.
Otra ventaja es que el cliente no tiene que esperar el procesamiento completo del servidor y puede continuar con otras tareas. El cliente puede seguir con lo que estaba haciendo mientras espera la respuesta del servidor. Cuando el resultado esté disponible, éste puede ser mostrado de forma inmediata.
Dependiendo de la implementación del patrón, las peticiones de los clientes pueden ponerse en cola, permitiendo que el servidor organice y priorice su carga de trabajo. También permite que el servidor notifique a los clientes cuando suceden cambios mas halla del tiempo de vida habitual de un cliente. Los agentes Web son un buen ejemplo de esto, porque permiten que los clientes introduzcan una petición en una sesión Web y reciban una notificación de otra sesión.
Un desafió del patrón Callback es que necesita que un cliente escuche las retrollamadas del servidor. Esto a menudo hace que el código del cliente se mas completo, e incrementa la carga de los sistemas cliente. Un inconveniente adicional surge del hecho de que Callback desacopla la petición del cliente. Eso suele dificultar la cancelación o modificación de una petición una vez que ha sido enviada al servidor.
Las variaciones del patrón Callback se centran generalmente en las estrategias de procesamiento del servidor y en las aproximaciones sobre las notificaciones a los clientes. Las dos aproximaciones principales para el procesamiento en el lado del servidor son:
Solo hay opciones disponibles para notificaciones de los clientes, dependiendo de los requisitos de las aplicaciones:
Entre lo patrones relacionados con Callback se incluye Worker Thread. El patrón worker Thread es utilizado para ayudar a planificar las peticiones de los clientes.
Las peticiones se sitúan en una cola, y los threads trabajadores procesan.
Ejemplo:
CallbackServer.java
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface CallbackServer extends Remote{
public void getProject(String projectID, String callbackMachine,
String callbackObjectName) throws RemoteException;
}
CallbackServerImpl.java
import java.rmi.Naming;
import java.rmi.server.UnicastRemoteObject;
public class CallbackServerImpl implements CallbackServer{
private static final String CALLBACK_SERVER_SERVICE_NAME = "callbackServer";
public CallbackServerImpl(){
try {
UnicastRemoteObject.exportObject(this);
Naming.rebind(CALLBACK_SERVER_SERVICE_NAME, this);
}
catch (Exception exc){
System.err.println("Error using RMI to register the CallbackServerImpl " + exc);
}
}
public void getProject(String projectID, String callbackMachine,
String callbackObjectName){
new CallbackServerDelegate(projectID, callbackMachine, callbackObjectName);
}
}
CallbackServerDelegate.java
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class CallbackServerDelegate implements Runnable{
private Thread processingThread;
private String projectID;
private String callbackMachine;
private String callbackObjectName;
public CallbackServerDelegate(String newProjectID, String newCallbackMachine,
String newCallbackObjectName){
projectID = newProjectID;
callbackMachine = newCallbackMachine;
callbackObjectName = newCallbackObjectName;
processingThread = new Thread(this);
processingThread.start();
}
public void run(){
Project result = getProject();
sendProjectToClient(result);
}
private Project getProject(){
return new Project(projectID, "Test project");
}
private void sendProjectToClient(Project project){
try{
String url = "//" + callbackMachine + "/" + callbackObjectName;
Object remoteClient = Naming.lookup(url);
if (remoteClient instanceof CallbackClient){
((CallbackClient)remoteClient).receiveProject(project);
}
}
catch (RemoteException exc){}
catch (NotBoundException exc){}
catch (MalformedURLException exc){}
}
}
CallbackClient.java
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface CallbackClient extends Remote{
public void receiveProject(Project project) throws RemoteException;
}
CallbackClientImpl.java
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class CallbackClientImpl implements CallbackClient{
private static final String CALLBACK_CLIENT_SERVICE_NAME = "callbackClient";
private static final String CALLBACK_SERVER_SERVICE_NAME = "callbackServer";
private static final String CALLBACK_SERVER_MACHINE_NAME = "localhost";
private Project requestedProject;
private boolean projectAvailable;
public CallbackClientImpl(){
try {
UnicastRemoteObject.exportObject(this);
Naming.rebind(CALLBACK_CLIENT_SERVICE_NAME, this);
}
catch (Exception exc){
System.err.println("Error using RMI to register the CallbackClientImpl " + exc);
}
}
public void receiveProject(Project project){
requestedProject = project;
projectAvailable = true;
}
public void requestProject(String projectName){
try{
String url = "//" + CALLBACK_SERVER_MACHINE_NAME + "/" + CALLBACK_SERVER_SERVICE_NAME;
Object remoteServer = Naming.lookup(url);
if (remoteServer instanceof CallbackServer){
((CallbackServer)remoteServer).getProject(projectName,
InetAddress.getLocalHost().getHostName(),
CALLBACK_CLIENT_SERVICE_NAME);
}
projectAvailable = false;
}
catch (RemoteException exc){}
catch (NotBoundException exc){}
catch (MalformedURLException exc){}
catch (UnknownHostException exc){}
}
public Project getProject(){ return requestedProject; }
public boolean isProjectAvailable(){ return projectAvailable; }
}
Patrones de diseño aplicados a JAVA
STEPHEN STELTING /OLAV MAASSEN
Darwin Vélez Vargas

Universidad Tecnológica Equinoccial
Técnicas Avanzadas de Programación
2006/06/30
6to "A" Informática
Página anterior | ![]() Volver al principio del trabajo | Página siguiente ![]() |
Trabajos relacionados
Ver mas trabajos de Arquitectura y Diseño |
|
Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.