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

Naming X Trader - IME-USP