Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

12
Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus

Transcript of Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

Page 1: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

Tecgraf PUC-Riofevereiro de 2011

Aplicação Java cliente do OpenDreams Openbus

Page 2: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

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

Page 3: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

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

Page 4: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

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

Page 5: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

Registro das fábricas dos valuetypesimport tecgraf.openbus.data_service.DataDescriptionFactory;import tecgraf.openbus.data_service.DataDescriptionHelper;import tecgraf.openbus.project.ProjectItemDescriptionHelper;import tecgraf.openbus.data_service.project.ProjectItemDescriptionFactory;import tecgraf.openbus.data_service.UnstructuredDataFactory;import 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());

Page 6: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

Procurando o serviço OpenDreamsString 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

Page 7: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

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

Page 8: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

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 registradono ORB com a sua respectiva fábrica

Page 9: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

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 ojob no serviço OpenDreams• Após a submissão, o JobTemplate pode ser removido da sessão

session.deleteJobTemplate(jt);

Page 10: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

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);

Page 11: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

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

Page 12: Tecgraf PUC-Rio fevereiro de 2011 Aplicação Java cliente do OpenDreams Openbus.

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); } }