Aplicação Java cliente do OpenDreams Openbus Tecgraf PUC-Rio fevereiro de 2011 Sobre o exemplo • Mostraremos um exemplo de uma aplicação cliente que usa o OpenDreams publicado no Openbus pelos sistemas CSBase. • Para tal, vamos assumir que existe um CSGrid (ou outro sistema CSBase) executando e que tenha publicado em um barramento OpenBus o serviço OpenDreams. • Componente de serviço IOpenDreams Passo 1: Obtendo as libs do OpenDreams • A última versão das bibliotecas java do Serviço OpenDreams pode ser obtida em: https://jira.tecgraf.puc-rio.br/confluence/display/OpenDreams. • Essa biblioteca já possui as classes compiladas das interfaces IDL do OpenDreams, bem como as classes e fábricas que implementam em Java os valuetypes definidos nessa interface. • A última versão da lib java do OpenDreams é: • opendreams-1.4.1.jar Passo 2: Implementando o Cliente • O programa cliente se encarrega de: – inicializar o Openbus e registrar as fábricas dos value types utilizados – fazer a autenticação no barramento – iniciar uma sessão no OpenDreams – definir um jobtemplate para submissão de um job – submterer a execução de um job – aguardar o término do job Registro das fábricas dos valuetypes import import import import import import ... tecgraf.openbus.data_service.DataDescriptionFactory; tecgraf.openbus.data_service.DataDescriptionHelper; tecgraf.openbus.project.ProjectItemDescriptionHelper; tecgraf.openbus.data_service.project.ProjectItemDescriptionFactory; tecgraf.openbus.data_service.UnstructuredDataFactory; tecgraf.openbus.data_service.UnstructuredDataHelper; Openbus bus = Openbus.getInstance(); ORB orb = (ORB) bus.getORB(); orb.register_value_factory(OpenDreamsJobTemplateHelper.id(), new OpenDreamsJobTemplateFactory()); orb.register_value_factory(JobInfoHelper.id(), new JobInfoFactory()); Procurando o serviço OpenDreams String componentName = props.getProperty("opendreams.component.name”); String componentVersion = props.getProperty("opendreams.component.version”); String componentId = componentName + ":" + componentVersion; Property property = new Property("component_id", new String[] { componentId }); ServiceOffer[] servicesOffers = registryService.findByCriteria(new String[] { IOpenDreamsHelper.id() }, new Property[] { property }); if (servicesOffers.length == 0) { throw new OpenDreamsClientException( "Não foi encontrado um serviço OpenDreams com identificador: " + componentId); } if (servicesOffers.length > 1) { throw new OpenDreamsClientException( "Foi encontrado mais de um serviço OpenDreams com identificador: " + componentId); } ServiceOffer serviceOffer = servicesOffers[0]; IComponent component = serviceOffer.member; IOpenDreams openDreamsService = IOpenDreamsHelper.narrow(component.getFacet(IOpenDreamsHelper.id())); • Outra forma de procurar pelo componente é usando a propriedade registered_by com o nome da entidade que publicou o componente f Obtendo uma sessão String projectName = props.getProperty("dataservice.project.name"); Session session = session = opendreams.getSession(projectName); session.init(""); • Uma sessão do OpenDreams é identificada pelo usuário dono da credencial e pelo projeto do CSBase no qual essa sessão atua para acesso aos dados Criando um JobTemplate OpenDreamsJobTemplate jt = (OpenDreamsJobTemplate) session.createJobTemplate(); jt.remoteCommand = "execAlgo"; jt.args = new String[] { "-name", "Teste da SimpleDemoOpenDreams", "-version”, "1.0.0" }; jt.jobDescription = "Teste da Demo Simples do OpenDreams pela Julia"; jt.jobParameters = new String[][] { { "qtde", "3" }, { "duracao", "2" } }; jt.outputPath = "saida.out"; jt.email = new String[] { "[email protected]" }; • O valuetype OpenDreamsJobTemplate precisa estar registrado no ORB com a sua respectiva fábrica Submetendo um job para execução String jobName = session.runJob(jt); • O JobTemplate é colocado na fila de escalonamento para execução • O valor retornado pelo método runJob é um nome que identifica o job no serviço OpenDreams • Após a submissão, o JobTemplate pode ser removido da sessão session.deleteJobTemplate(jt); Aguardando o término da execução JobInfo jobInfo = session ._wait(jobName, Session.TIMEOUT_WAIT_FOREVER); System.out.println("** Resultado: hasExited = " + jobInfo.hasExited + ": exitStatus = " + jobInfo.exitStatus); • O valuetype JobInfo precisa estar registrado no ORB com a sua respectiva fábrica • No caso de ser necessário outras informações sobre o término do job, o valuetype OpenDreamsJobInfo fornece dados adicionais OpenDreamsJobInfo jobInfo = (OpenDreamsJobInfo) session ._wait(jobName, Session.TIMEOUT_WAIT_FOREVER); System.out.println("** Tipo de finalizacao: " + jobInfo.finalizationType); Finalizando a sessão session.exit(); • Ao finalizar a sessão, os jobtemplates criados naquela sessão são removidos e não podem ser mais utilizados Lendo um arquivo usando o FTC public byte[] readRemoteFile(DataDescription desc) throws ProjectServiceClientException { try { UnstructuredData view = (UnstructuredData) dataService.getDataView(desc.fKey, UnstructuredDataHelper.id()); DataKey dataKey = new DataKey(view.fKey); RemoteFileChannel rfc = new RemoteFileChannelImpl(dataKey.getDataId().getBytes( Utils.CHARSET_ENCODING), view.fWritable, view.fHost, view.fPort, view.fAccessKey); rfc.open(true); int fileSize = (int) rfc.getSize(); byte[] buffer = new byte[fileSize]; if (fileSize != 0) { rfc.read(buffer); } rfc.close(); return buffer; } catch (Exception e) { throw new ProjectServiceClientException( "Erro na leitura de um dado da pasta", e); } }