Neste exercício você implementará um invocador ICE que siga o esquema descrito na seção 1. Seu ICEInvoker receberá invocações remotas através do protocolo do ICE e repassará cada invocação para o container MBean associado ao EJB alvo. O invocador que você escreverá será voltado exclusivamente para clientes Java, pois utilizará proxies dinâmicos no lado do cliente. Antes de escrever esse invocador você deve ler o material sobre service MBeans do JBoss (esse material está no xerox do CAMAT) e estudar detalhadamente o código de algum dos invocadores existentes no JBoss. (O JRMPInvoker é um bom modelo. O IIOPInvoker não é, pois ele não segue o esquema descrito na seção 1.)
Além de ser um service MBean do JBoss, seu ICEInvoker deve ser um servente ICE que implementa a seguinte interface SLICE:
module org { module jboss { module invocation { module ice { sequence<byte> JavaSerializedObject; exception InvocationException { JavaSerializedObject javaException; }; interface Invoker { nonmutating string getServerHostName(); JavaSerializedObject invoke(JavaSerializedObject invocation) throws InvocationException; }; }; }; }; };O arquivo SLICE com a definição dessa interface está disponível em http://www.ime.usp.br/~reverbel/SMA-03/trabalhos/ep1/ep1.ice. Os arquivos-fonte Java automaticamente gerados (pelo slice2java) a partir dessa definição estão disponíveis no diretório http://www.ime.usp.br/~reverbel/SMA-03/trabalhos/ep1/generated/.
Use o método startService() para registrar o servente ICE com um adaptador de objetos2e para obter um ICE proxy3 para a interface org.jboss.invocation.ice.Invoker.
Escreva também a classe ICEInvokerProxy, que implementa um invoker proxy associado a um ICEInvoker. Esse invoker proxy possui um ICE proxy para o objeto ICE remoto implementado por seu ICEInvoker. Ele implementa a interface org.jboss.invocation.Invoker simplesmente repassando as chamadas ao ICEInvoker remoto. É importante que o ICEInvokerProxy seja externalizável e que seus métodos readExternal() e writeExternal() sejam definidos de modo a permitir que ele seja passado por valor do servidor para os clientes.
Para testar e exercitar seu ICEInvoker, crie uma configuração do JBoss que use esse invocador como default. Implante num servidor com essa configuração os EJBs desenvolvidos no ``EP zero'', que (em princípio) não devem precisar de alteração alguma para funcionarem com o ICEInvoker.
Sua solução deve rodar em JBoss 3.2.2. Use o programa ant para automatizar a geração do seu invocador.
Este exercício deve ser feito preferencialmente em equipes de duas pessoas. O ideal é o esquema de ``programação pareada'' (pair programming) de XP. Como alguns podem ter restrições de horário que os impeçam de trabalhar assim, aceitarei também exercícios individuais.
Dúvidas sobre o enunciado devem ser enviadas para reverbel-sma@ime.usp.br.
Bom trabalho!