Serviço de Negociação(Trading Service)
Serviço de Nomes
• Serviço de nomes CORBA:• mapeia nomes a objetos• clientes devem saber exatamente qual
objeto desejam
Necesidades do usuário
• Serviço mais dinâmico de descoberta de objetos
• cliente possui dados imprecisos ou incompletos sobre o que deseja
• uma maior variedade de serviços com funções semelhantes
Serviço de negociação
• OMG Trading Service• como o serviço de nomes, contém
referências para objetos• usuários utilizam o trader para obter
informações sobre serviços que atendam a suas necessidades
• análogo às páginas amarelas
Funcionalidades
• armazena anúncios de serviços• entidades anunciam um
serviço(exporter)• a referência do objeto anunciado é
imutável.• a descrição do serviço é feita pelas
suas propriedades, que podem ser alteradas
Funcionalidades
• pode-se anunciar um objeto mais de uma vez, sob diferentes propriedades
• anúncios podem ser retirados do trader (withdraw)
• procura por serviços sob certas restrições de propriedades do serviço (import)
Tipos de Serviço
• são armazenados num banco de dados de tipos de serviço, o Repositório de Tipos de Serviço
• cada trader pode ter referência para somente 1 repositório
Repos. de tipos Trader1 *uses
Tipos de Serviço
• são identificados por um nome único no repositório• Possuem:
• uma identificação• uma lista de definições de
propriedades (pode ser vazia)
• uma lista de tipos de serviços pais (pode ser vazia)
IncarnationNumber add_type( in CosTrading::ServiceTypeName name, in Identifier if_name,
in PropStructSeq props,
in ServiceTypeNameSeq super_types
)
Tipos de ServiçosPropriedades
• são definidas por:• um nome• um código que determina o tipo do valor da
propriedade• o tipo
• normal• somente para leitura• obrigatória• obrigatória e somente para leitura
• dinâmicas ou estáticas
Propriedades
• Dinâmicas• podem mudar ao longo do tempo, como o
número de folhas numa impressora• a cada pesquisa, é consultado o valor da
propriedade naquele momento• é mais lento que propriedades estáticas
• Estáticas• “imutáveis” - mudam com intervenção do
administrador• podem não refletir o estado real do objeto
Exemplos de tipos de serviços
• serviço de vídeo-conferência• serviço de segurança ou certificação• serviço de transações• serviço de bate-papo• serviço para armazenamento de
grandes quantidades de dados (strorage)
• serviço de informação do clima
Módulos do trader - IDL
CosTrading• TraderComponents: atributos para as
componentes do trader• Register: operações para criação novas ofertas
de serviços (exporters)• Lookup: operações para pesquisa de serviços
(importers)• Admin: atributos para administração de políticas • Link: operações para conexão entre traders
(federação)• Proxy: operações para proxies - objetos que não
são implementações
Módulos do trader - IDL
CosTradingRepos• ServiceTypeRepository: operações para
manipular tipos de serviço
CosTradingDynamic• DynamicPropEval: para obter valores de
propriedades dinâmicas
Interação com o trader
• 3 estágios principais:
• definição do tipo no repositório de tipos
• registro do serviço
• pesquisa de serviço
Registrando um tipo de serviço
CosTradingRepos
Definição, consulta e remoção de tipos de serviços
module CosTradingRepos { interface ServiceTypeRepository { IncarnationNumber add_type( in CosTrading::ServiceTypeName name, in Identifier if_name, in PropStructSeq props, in ServiceTypeNameSeq super_types) void remove_type(in CosTrading::ServiceTypeName name) };};
Oferta de serviço
• é a descrição de um serviço• Exemplo
Printer
name: stringfloor: shortlanguage: stringcolor: stringppm: short
Propriedades
Oferta de serviço
• é a descrição de um serviço
IncarnationNumber add_type(
in CosTrading::ServiceTypeName name,
in Identifier if_name,
in PropStructSeq props,
in ServiceTypeNameSeq super_types
)
IDL:printer:1.0
IDL:printer_if:1.0
name: stringfloor: shortlanguage: stringcolor: stringppm: short
Propriedades
Implementação// conecta com o trader e obtém o objeto lookup
org.omg.CORBA.Object trader = orb.resolve_initial_references("TradingService");
Lookup lookup = LookupHelper.narrow(trader);
// referência para o repositório de tiposorg.omg.CORBA.Object obj = lookup.type_repos();
ServiceTypeRepository typeRepos = ServiceTypeRepositoryHelper.narrow(obj);
// cria uma seqüência de estrutura de propriedades.omg.CosTradingRepos.ServiceTypeRepositoryPackage.PropStruct[] props =new org.omg.CosTradingRepos.ServiceTypeRepositoryPackage.PropStruct[1];
Implementaçãoprops[0] = new ...PropStruct();
// string que representa o nome da propriedadeprops[0].name = "name";
// tipo da propriedadeprops[0].value_type = orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_string);
// modo da propriedade (MANDATORY, READONLY ou NORMAL)props[0].mode = PropertyMode.PROP_MANDATORY_READONLY;
props[1] ...
// adiciona o novo tipo de serviçotypeRepos.add_type("printer", // tipo do serviço "IDL:Printer:1.0",// nome da IDL props, // propriedades new String[0]); // supertipos para herdar
Registrando um serviço
Interface Register
• registro de uma oferta de serviçoOfferId export(in Object reference, in ServiceTypeName type, in PropertySeq properties)
• modificação de um serviço
• remoção um serviço já existente
void modify(in OfferId id, in PropertyNameSeq del_list, in PropertySeq modify_list)
void withdraw(in OfferId id)
interface Register {
OfferId export(
in Object reference,
in ServiceTypeName type,
in PropertySeq properties
);
};
: Printer
name = hp5000floor = 4language = pscolor = 256ppm = 12
Propriedades
struct Property { PropertyName name; PropertyValue value;};
IDL:printer:1.0
Implementação// cria o servente e conecta-oPrinterImpl printerImpl = new PrinterImpl();Printer printer = printerImpl._this(orb);
// usa o objeto lookup para obter a componente “Register”
Register register = lookup.register_if();
// seqüência de propriedadesorg.omg.CosTrading.Property[] props_reg = new org.omg.CosTrading.Property[1];props_reg[0] = new org.omg.CosTrading.Property(); props_reg[0].name = "name"; props_reg[0].value = orb.create_any(); props_reg[0].value.insert_string("laser4");
// exporta o serviçoString offer_id = register.export( printer, // o objeto "printer", // tipo do serviço props_reg); // propriedades
Pesquisa de serviço
Interface Lookup
oferece meios de pesquisa:• por um serviço específico• que atende determinadas restrições• por ordem de preferência
void query( in ServiceTypeName type, in Constraint constr, in Preference pref, in PolicySeq policies, in SpecifiedProps desired_props, in unsigned long how_many, out OfferSeq offers, out OfferIterator offer_itr, out PolicyNameSeq limits_applied)
Expressões de busca(usadas como preferência)
• literais‘a’ ‘string’
• comparação== != < > <= >=
• operadores aritméticos+ - * /
• operadores booleanosand or not
• pertinência‘elemento’ in Conjunto
• substrings‘de’ ~ ‘abcdefg’
• existência (de prop.)exist Propriedade
Políticas para consultas
• search_card, match_card, return_card: número máximo de serviços para serem procurados, ordenados e retornados, respectivamente
• max_list: número máximo a ser retornado. Para o restante, usa-se next_n()
• support_dynamic_properties: busca considera serviços com propriedades dinâmicas
• support_modifiable_properties: busca não considera propriedades somente-para-leitura
• outras (federação)...
Exemplo de busca
Serviços disponíveis
Name Floor Language Color PPMmtl-all 3 postscript black 24rle 2 text black 40hpps 2 postscript black 24blue 2 postscript 256 12colorPS 3 postscript color 12
Restrição: ((color == 'black') and (language == 'postscript'))Preferências: min(floor)
Resultado da busca
name = rlecolor = blackfloor = 2language = postscriptppm = 40
IOR:00000000002449444c3a6f6d672e6f72672f436...
Oferta 1
name = hppscolor = blackfloor = 3language = postscriptppm = 24
IOR:000000d49444c3a6fd672e6f72672f436f73547 ...
Oferta 2
Implementaçãolookup.query( // tipo do serviço "printer", // restrições "((color == 'black') and (language == 'postscript'))", // ordem de preferência (first, max, min, with, random) // em que as ofertas serão retornadas "random", // políticas desejadas (27) defaultPolicies, // propriedades a serem retornadas (all, some, none) desiredProperties, // número inicial de ofertas a serem retornadas 5, // ofertas retornadas offers, // ofertas restantes iterator, // políticas que tiveram seus limites atingidos limitsReached);
Federação de traders
Conceitos gerais
• agrupa recursos• balanceamento de carga• replicação• escalabilidade• melhor gereciamento das ofertas de
serviços e das requisições• destina-se somente a consultas, não a
registro de serviços
D
A
C
F
B
E
Interface Link
• criação de um vínculovoid add_link(in LinkName name, in Lookup target, in FollowOption def_pass_on_follow_rule, in FollowOption limiting_follow_rule)
• modificação de um vínculo
• remoção de vínculos
void modify_link(in LinkName name, in FollowOption def_pass_on_follow_rule, in FollowOption limiting_follow_rule
void remove_link(in LinkName name)
enum FollowOption { // pesquisa local somente local_only, // passa para outros, se não encontrar localmente if_no_local, // sempre encaminha para outros always};
Políticas para consultas
• follow_rule• local_only: pesquisa local somente• if_no_local: encaminha para outros, se não
encontrar localmente• always: sempre encaminha
• starting_trader: consulta é encaminhada para todos os traders e inicia no último
• hop_count: número máximo de traders que uma consulta pode percorrer
Administração
interface Admin : TraderComponents, SupportAttributes, ImportAttributes, LinkAttributes {
readonly attribute OctetSeq request_id_stem; unsigned long set_def_search_card (in unsigned long value); unsigned long set_max_search_card (in unsigned long value); unsigned long set_def_match_card (in unsigned long value); unsigned long set_max_match_card (in unsigned long value); unsigned long set_def_return_card (in unsigned long value); unsigned long set_max_return_card (in unsigned long value); unsigned long set_max_list (in unsigned long value); boolean set_supports_modifiable_properties (in boolean value); boolean set_supports_dynamic_properties (in boolean value); boolean set_supports_proxy_offers (in boolean value); unsigned long set_def_hop_count (in unsigned long value); unsigned long set_max_hop_count (in unsigned long value); FollowOption set_def_follow_policy (in FollowOption policy); FollowOption set_max_follow_policy (in FollowOption policy); FollowOption set_max_link_follow_policy (in FollowOption policy); TypeRepository set_type_repos (in TypeRepository repository);};