1. Hay que implementar el sistema de callback en ICE: - En la interfaz Ice se define una funcion de paso que contiene como argumento "un puntero C" de la interfaz que se pasa. - Al hacer adapter.add() se toma el valor de retorno que es un Ice.ObjectPrx. Se castea al stub (Prx) con la función PrxHelper. - Se pasa el stub Prx como argumento en la función de paso. 2. Hay que dimensionar los thread-pools cliente y servidor. Tipicamente en el main: public static void main(String args[]) { Ice.Properties propiedades = new Ice.Util().createProperties(args); propiedades.setProperty("Ice.ThreadPool.Server.Size", "5" ); propiedades.setProperty("Ice.ThreadPool.Client.Size", "5" ); Ice.InitializationData init_data = new Ice.InitializationData(); init_data.properties = propiedades; Ice.Communicator ic = Ice.Util.initialize(init_data); ... // aqui se instancia las clases principales pasandoles el ic } 2. La excepcion IndexOutOfRange hay que usar la del paquete Ice y no la que proviene del codigo base. Basta con importarla. import PAQUETE.IndexOutOfRange 3. La excepcion InterruptedException no es compatible con Ice. a) No la lanzamos (ponemos el catch en el wait) b) Nos creamos otra excepcion de ICE y relanzamos esta en el catch de InterruptedException. 4. La clase DigitalIODriver implementa: - DigitalIOListenerRmt - DigitalIoDriverRmt ambas con ICE. En el addInterruptListener, con RMI se hacia un cast de una a otra, pero en Ice este cast no es posible. Solucion: a) Poner el metodo newchange en DigitalIODriver (feo) b) Añadir una funcion addDigitalIODriver en la interfaz de DigitalIOCard de manera que pasemos por separado los stubs de DigitalIOListener y DigitalIODriver.