Esta entidade pretende disponibilizar ao sistema em geral (outras entidades), uma forma simples, transparente e minimamente coerente de gerir a informação pública do sistema. Há quem chame a este tipo de entidades, Facilitators.
As entidades do sistema são responsáveis pela publicação e coerência da sua informação pública, excepto no que se refere à sua localização. Ou seja, assim que as entidades aderem ao serviço de informação, a sua localização é armazenada e disponibilizada a quem o desejar. Assim que a entidade deixar o sistema, a sua localização e demais informação entretanto publicada é apagada do serviço, e portanto não será mais disponibilizada a outras entidades.
No sentido de organizar o próprio serviço de informação, bem como sugerir regras de gestão da informação por parte da entidade aderente, o serviço de informação é dividido por domínios de informação. O conceito de domínio é genérico e versátil, mas pretende ser o agrupamento de informação dum determinado tipo. Por exemplo, poder-se-ía pensar em informação referente a bancos, ao comércio de computadores ou comérico de carros, etc., sendo portanto necessário a implementação de rotinas de armazenamento e manipulação da informação consoante o domínio.
O serviço de informação é composto por dois tipos de entidades, os servidores e os clientes. Cada servidor de domínio tem conhecimento da existência e localização de todos os outros. Este conhecimento é dinâmico e é adquirido através dum processo de contacto ou conexão semelhante à conexão do cliente.
A informação é armazenada internamente no seguinte formato:
{Name_Node, Pid, Information} Name_Node={atom(),node()} % do cliente Pid=pid() % do cliente Information=[Category] Category={atom(),[Activity]} Activity={atom,[atom()]}
Um exemplo:
{ {client1,node1@@host1},<xx.yy.zz>, [ {business, [ {sell,[computadores,informatica]}, {repair,[computadores]} ] }, {personal, [ {sport,[squash,football]} ] } ] }
Para se lançar um servidor Infsys há que ter em consideração os seguintes pontos:
Ou seja, cada servidor Infsys deve especificar:
infsys:start([Args]) -> ok | {error,Reason} Args=Name | Domain Name={name, atom()} % default=infsys Domain={domain,[Domain_options]} Domain_options= Domain_name | Domain_timeout | Client_timeout Brodcast_port | Broadcast_contact | Domain_static_connections | Domain_dynamic_connections Domain_name={domain_name,atom()} % default=infsys Domain_timeout={domain_timeout,integer()} % default=5000ms Client_timeout={client_timeout,integer()} % default=10000ms Broadcast_port={broadcast_port,Port_num} Port_num=integer() % 1024 < Port_num < 65535 % default=15000 Broadcast_contact={broadcast_contact,accept|reject} % default=accept Domain_static_connections={static_connections,Static_connections_options} Static_connections_options=none|[Name_Node] %default=none Domain_dynamic_connections={dynamic_connections,yes|no} %default=yes Name_Node={Name,Node} Name=atom() Node=node() Reason=atom()
infsys:start() -> ok | {error, Reason} Reason=atom()
Nota: Pressupõe-se que todos os parâmetros necessários estão definidos no dicionário ou são usados os valores por defeito.
As entidades que desejem aderir ao serviço têm dois métodos possíveis:
infsys_client:connect([Domain_args]) -> Name_Node | {error,Reason} Domain_args=Domain_name | Domain_timeout | Domain_server Domain_name={domain_name,atom()} % default=infsys Timeout={domain_timeout,integer()} % default=10000ms Domain_server=Name_Node Name_Node={Name,Node} Name=atom() Node=node() Reason=atom()infsys_client:connect() -> Name_Node | {error,Reason}Nota: Pressupõe-se que todos os parâmetros necessários estão definidos no dicionário ou são usados os valores por defeito.
infsys_client:contact([Domain_args]) -> Name_Node | {error,Reason} Domain_args=Domain_name | Domain_broadcast_port | Domain_timeout Domain_name={domain_name,atom()} % default=infsys Domain_broadcast_port={domain_broadcast_port,Port_num} Port_num=integer() % 1024 < Port_num < 65535 default=15000 Timeout={domain_timeout,integer()} % default=10000ms Name_Node={Name,Node} Name=atom() Node=node() Reason=atom()infsys_client:contact() -> Name_Node | {error,Reason}Nota: Pressupõe-se que todos os parâmetros necessários estão definidos no dicionário ou são usados os valores por defeito.
Nota 1: Os valores de domain_name,
domain_server, domain_broadcast_port
e domain_timeout, podem também ser
previamente colocados do dicionário do processo.
Nota 2: A ordem de preferência de utilização dos valores será:
Nota 3: Os valores especificados/utilizados substituirão os valores anteriormente existentes no dicionário.
Quando se deseja desconectar de um servidor de informação. Toda a informação referente à entidade que se desconecta é apagada do serviço e como tal não é mais disponibilizada.
infsys_client:disconnect(Domain_server) -> ok | {error,Reason} Domain_server=Name_Node Name_Node={Name,Node} Name=atom() Node=node() Reason=atom()infsys_client:disconnect() -> ok | {error,Reason}Nota: Pressupõe-se que todos os parâmetros necessários estão definidos no dicionário ou são usados os valores por defeito.
Esta função adiciona à informação do cliente, a informação especificada em What. A informação adicionada é automaticamente disponibilizada para o domínio.
infsys_client:publish(What) -> ok | {error,Reason} What={Category,Activity,Items} Category=atom() % ex.: business, study, hobby, personal Activity=atom() % ex.: business:sell|buy|repair|bank, hobby:sport, personal:watch_tv Items=[atom()] | atom() % ex.: sell:computer, repair:computer, bank:credit Reason=atom()
Estas funções servem para questionar o sistema de informação. O servidor a quem o cliente está conectado, é responsável por procurar a informação no domínio e disponibilizar ao cliente sem que este intervenha.
O servidor a contactar deverá estar previamente definido na entrada do dicionário infsys. Ou seja, a função put(infsys, Name_Node) deverá em devido tempo ser executada, sendo Name_Node o valor retornado por contact ou connect. Assim sendo, o cliente poderá fazer a gestão interna de domínios com quem "funciona".
infsys_client:whereis(Who) -> [Location] | {error,Reason} Who=atom() | [atom()] Location={Who,Node} Node=node() | undefined Reason=atom()Nota: Parte-se do princípio que Who apenas existe numa localização e que apenas um servidor de domínio lhe está conectado. Assim, depois de receber a localização de Who diferente de undefined não pergunta aos restantes servidores.
infsys_client:whodoes(What) -> {What,[Name_Node]} | {error,Reason} What= (ver infsys_client:publish/1) Name_Node={Name,Node} Name=atom() Node=node() Reason=atom()Nota: Como podem existir várias entidades a realizar a mesma actividade, e que podem estar conectadas a diferentes servidores de informação, então a pergunta tem de ser realizada a todas as entidades, e apenas o conjunto de informação recebido é correcto e completo. Assim, a pergunta é feita a todos os servidores do domínio.
infsys_client:'query'(What,Type) -> {What,[Name_Node]} | {error,Reason} What= (ver infsys_client:publish/1) Type= all | first Name_Node={Name,Node} Name=atom() Node=node() Domain=atom() Reason=atom()Nota 1: Esta função é disponibilizada para que a conversação seja utilizada para qualquer tipo de informação e pergunta. Na realidade whereis e whodoes utilizam a função 'query'. Não deve ser utilizada directamente.
Nota 2: Em comparação com as funções anteriores, esta tem mais um parâmetro. Este parâmetro serve para especificar se o serviço de informação deve pesquisar todos (all) os outros servidores existentes no domínio e juntar toda a informação, ou se deve pesquisar apenas (first) até encontrar um que devolva o resultado diferente de {What,undefined}.
Esta função apaga à informação do cliente, a informação especificada em What.
infsys_client:delete(What) -> ok | {error,Reason} What= (ver infsys_client:publish/1) Reason=atom()
Última actualização: 02-05-2005