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

Seminário Tecgraf - Tecgraf JIRA / Confluence - PUC-Rio