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 1 Repos. de tipos uses * Trader Tipos de Serviço • são identificados por um nome único no repositório • Possuem: IncarnationNumber add_type( in CosTrading::ServiceTypeName name, in Identifier if_name, • uma identificação • uma lista de definições de propriedades (pode ser vazia) • uma lista de tipos de serviços pais (pode ser vazia) in PropStructSeq props, in ServiceTypeNameSeq super_types ) Tipos de Serviços Propriedades • 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 Propriedades name: string floor: short language: string color: string ppm: short Oferta de serviço • é a descrição de um serviço IDL:printer:1.0 IncarnationNumber add_type( in CosTrading::ServiceTypeName name, IDL:printer_if:1.0 in Identifier if_name, in PropStructSeq props, Propriedades name: string floor: short language: string color: string ppm: short in ServiceTypeNameSeq super_types ) 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 tipos org.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ção props[0] = new ...PropStruct(); // string que representa o nome da propriedade props[0].name = "name"; // tipo da propriedade props[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ço typeRepos.add_type("printer", // "IDL:Printer:1.0",// props, // new String[0]); // tipo do serviço nome da IDL propriedades supertipos para herdar Registrando um serviço Interface Register • registro de uma oferta de serviço OfferId export(in Object reference, in ServiceTypeName type, in PropertySeq properties) • modificação de um serviço void modify(in OfferId id, in PropertyNameSeq del_list, in PropertySeq modify_list) • remoção um serviço já existente void withdraw(in OfferId id) interface Register { OfferId export( : Printer in Object reference, IDL:printer:1.0 in ServiceTypeName type, in PropertySeq properties Propriedades name = hp5000 floor = 4 language = ps color = 256 ppm = 12 ); }; struct Property { PropertyName name; PropertyValue value; }; Implementação // cria o servente e conecta-o PrinterImpl 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 propriedades org.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ço String 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 • substrings ‘de’ ~ ‘abcdefg’ ‘a’ ‘string’ • comparação == != < > <= >= • operadores aritméticos + - * / • operadores booleanos and or not • pertinência ‘elemento’ in Conjunto • 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 Restrição: ((color == 'black') and (language == 'postscript')) Preferências: min(floor) Serviços disponíveis Name mtl-all rle hpps blue colorPS Floor 3 2 2 2 3 Language postscript text postscript postscript postscript Color black black black 256 color PPM 24 40 24 12 12 Resultado da busca Oferta 1 name = rle color = black floor = 2 language = postscript ppm = 40 IOR:00000000002449444c3a6f6d672e6f72672f436... Oferta 2 name = hpps color = black floor = 3 language = postscript ppm = 24 IOR:000000d49444c3a6fd672e6f72672f436f73547 ... Implementação lookup.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 A B C D E F Interface Link • criação de um vínculo void add_link(in in in in LinkName name, Lookup target, FollowOption def_pass_on_follow_rule, FollowOption limiting_follow_rule) • modificação enum FollowOptionde { um vínculo // pesquisa local somente void modify_link(in LinkName name, local_only, in FollowOption def_pass_on_follow_rule, // passa para outros, se não encontrar localmente in FollowOption limiting_follow_rule if_no_local, // sempre encaminha para outros always }; • remoção de vínculos void remove_link(in LinkName name) 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); };