SDK Openbus - Java Tecgraf PUC-Rio Fevereiro de 2014 Versão 3 – fevereiro/2014 Passo 1: Obtendo o SDK Openbus • A última versão do SDK Java do Openbus pode ser obtida em: • http://www.tecgraf.puc-rio.br/openbus • Precisaremos também do JDK 1.6 ou superior Versão 3 – fevereiro/2014 Libs do SDK Openbus 2.0.0.2 • Openbus: • openbus-sdk-core-2.0.0.2.jar • openbus-sdk-legacy-2.0.0.2.jar • Jacorb: • jacorb-3.3.jar • slf4j-api-1.6.4.jar • slf4j-jdk14-1.6.4.jar • SCS: • scs-core-1.2.1.2.jar Versão 3 – fevereiro/2014 Passo 2: Preparando os stubs e skeletons • Usaremos como base a mesma IDL do exemplo StockMarket mostrado no exercício do SCS • Compilar a IDL • Compilar o código Java das classes geradas pelo compilador IDL e das classes que implementam as facetas descritas na IDL Versão 3 – fevereiro/2014 Passo 3: Implementando as facetas do componente • O componente StockSeller possui duas facetas: • StockServer • StockExchange • As classes StockServerImpl e StockExchangeImpl implementam, respectivamente, cada uma dessas facetas • Opcionalmente, para compartilhar o estado entre as duas facetas, teremos implementada a classe StockSellerContext de contexto do componente Versão 3 – fevereiro/2014 Passo 4: Implementando um Servidor • Um programa servidor se encarrega de: – realizar a conexão por certificado – criar o componente que implementa as facetas necessárias – registrar uma oferta de serviço – instalar um ShutdownHook para desconectar do barramento antes de finalizar a aplicação – manter ativa a execução do ORB Versão 3 – fevereiro/2014 Fluxo principal do servidor public static void main(String[] args) throws IOException, InvalidName, AdapterInactive, SCSException { // Lê arquivo de propriedades Properties props = loadProperties(); // Cria um assistente do OpenBus final Assistant assistant = connectWithOpenBus(props); final ORB orb = assistant.orb(); POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); // Dispara uma thread para garantir o recebimento de chamadas pelo ORB Thread run = new Thread() { @Override public void run() { orb.run(); } }; run.start(); // Adiciona uma thread a ser executada em caso de término do processo. Essa thread faz a desconexão com o // barramento. Thread shutdown = new Thread() { @Override public void run() { assistant.shutdown(); orb.shutdown(true); orb.destroy(); } }; Runtime.getRuntime().addShutdownHook(shutdown); // Cria componente IComponent component = createComponent(orb, poa); // Registra o serviço no barramento ServiceProperty[] serviceProperties = new ServiceProperty[] { new ServiceProperty(“my property", “<value>") }; assistant.registerService(component, serviceProperties); } Versão 3 – fevereiro/2014 Fazer a conexão por certificado private static Assistant connectWithOpenBus(Properties props) { String host = props.getProperty("host.name"); int port = Integer.parseInt(props.getProperty("host.port")); String entity = props.getProperty("seller.name"); String privateKeyFile = props.getProperty("seller.key"); PrivateKey privateKey = null; try { privateKey = OpenBusPrivateKey. createPrivateKeyFromFile(privateKeyFile); } catch (Exception e) { System.out.println("O caminho da chave privada deve apontar para uma chave válida."); e.printStackTrace(); System.exit(1); } … Versão 3 – fevereiro/2014 Fazer a conexão por certificado … AssistantParams params = new AssistantParams(); params.callback = new OnFailureCallback() { @Override public void onStartSharedAuthFailure(Assistant arg0, Throwable arg1) { System.out.println("Erro na tentativa de login por autenticação compartilhada: " + arg1); } @Override public void onRegisterFailure(Assistant arg0, IComponent arg1, ServiceProperty[] arg2, Throwable arg3) { System.out.println("Erro na tentativa de registro de oferta: " + arg3); } @Override public void onLoginFailure(Assistant arg0, Throwable arg1) { System.out.println("Erro na tentativa de login: " + arg1); } } @Override public void onFindFailure(Assistant arg0, Throwable arg1) { System.out.println("Erro na tentativa de busca: " + arg1); } }; return Assistant.createWithPrivateKey(host, port, entity, privateKey, params); Versão 3 – fevereiro/2014 Registrar a oferta de serviço ServiceProperty[] serviceProperties = new ServiceProperty[] { new ServiceProperty("offer.domain", “StockMarket") }; assistant.registerService(component, serviceProperties); Versão 3 – fevereiro/2014 Instalar o ShutdownHook Thread shutdown = new Thread() { @Override public void run() { assistant.shutdown(); orb.shutdown(true); orb.destroy(); } }; Runtime.getRuntime().addShutdownHook(shutdown); Versão 3 – fevereiro/2014 Iniciar thread para manter a execução do ORB Thread run = new Thread() { @Override public void run() { orb.run(); } }; run.start(); Versão 3 – fevereiro/2014 Passo 5: Implementando o Cliente • O programa cliente se encarrega de: – Conectar com o Openbus através de usuário e senha – Buscar pelo(s) serviço(s) que procura – Utilizar o(s) serviço(s) Versão 3 – fevereiro/2014 Conectando com usuário e senha AssistantParams params = new AssistantParams(); params.callback = new OnFailureCallback() { @Override public void onStartSharedAuthFailure(Assistant arg0, Throwable arg1) { System.out.println("Erro na tentativa de login por autenticação compartilhada: " + arg1); } @Override public void onRegisterFailure(Assistant arg0, IComponent arg1, ServiceProperty[] arg2, Throwable arg3) { System.out.println("Erro na tentativa de registro de oferta: " + arg3); } @Override public void onLoginFailure(Assistant arg0, Throwable arg1) { System.out.println("Erro na tentativa de login: " + arg1); } @Override public void onFindFailure(Assistant arg0, Throwable arg1) { System.out.println("Erro na tentativa de busca: " + arg1); } }; final Assistant assistant = Assistant.createWithPassword(host, port, login, password.getBytes(), params); Versão 3 – fevereiro/2014 Procurando pelas facetas private static IComponent findStockSeller(Assistant assistant, String offerEntity) { // busca por serviço ServiceProperty[] properties = new ServiceProperty[3]; properties[0] = new ServiceProperty("openbus.offer.entity", offerEntity); properties[1] = new ServiceProperty( "openbus.component.interface", StockServerHelper.id()); properties[2] = new ServiceProperty( "openbus.component.interface", StockExchangeHelper.id()); ServiceOfferDesc[] services = new ServiceOfferDesc[0]; try { services = assistant.findServices(properties, -1); } catch (ServiceFailure e) {…} catch (TRANSIENT e) {…} catch (COMM_FAILURE e) {…} catch (NO_PERMISSION e) { if (e.minor == NoLoginCode.value) {…} catch (Throwable e) {…} } // analiza as ofertas encontradas for (ServiceOfferDesc offerDesc : services) { try { if (offerDesc.service_ref._non_existent()) { System.out.println(“Um serviço encontrado encontra-se indisponível."); continue; } catch (Exception e) { continue; } return offerDesc.service_ref; } System.out.println("Nenhuma oferta válida foi encontrada."); System.exit(1); Versão 3 – fevereiro/2014