SDK Openbus - Java Tecgraf PUC-Rio Setembro de 2013 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 Libs do SDK Openbus 2.0.0.0 • Openbus: • openbus-sdk-core-2.0.0.0.jar • openbus-sdk-legacy-2.0.0.0.jar • openbus-sdk-demo-util-2.0.0.0.jar • Jacorb: • jacorb-3.1.jar • slf4j-api-1.6.4.jar • slf4j-jdk14-1.6.4.jar • SCS: • scs-core-1.2.1.1.jar • ANT: • ant-1.8.2.jar • ant-launcher-1.8.2.jar 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 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 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 – iniciar a execução do ORB 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); } 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); } return Assistant.createWithPrivateKey(host, port, entity, privateKey); } Registrar a oferta de serviço ServiceProperty[] serviceProperties = new ServiceProperty[] { new ServiceProperty("offer.domain", "Demo Hello") }; assistant.registerService(component, serviceProperties); Instalar o ShutdownHook Thread shutdown = new Thread() { @Override public void run() { assistant.shutdown(); orb.shutdown(true); orb.destroy(); } }; Runtime.getRuntime().addShutdownHook(shutdown); Iniciar a execução do ORB Thread run = new Thread() { @Override public void run() { orb.run(); } }; run.start(); 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) Conectando com usuário e senha final Assistant assistant = Assistant.createWithPassword(host, port, login, password.getBytes()); 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) { if (offerDesc.service_ref._non_existent()) { System.out.println(“Um serviço encontrado encontra-se indisponível."); continue; } return offerDesc.service_ref; } System.out.println("Nenhuma oferta válida foi encontrada."); System.exit(1);