Partilhar via


Desenvolvendo aplicativos de enfileiramento de RPC-Message

Muito pouco esforço é necessário para aproveitar o transporte MSMQ em seu aplicativo RPC. Para mensagens síncronas, você só precisa especificar o transporte da fila de mensagens (ncadg_mq) como a sequência de protocolo. O protocolo ncadg_mq suporta todos os recursos de datagrama padrão, exceto chamadas de transmissão. Além disso, observe que, atualmente, o transporte de fila de mensagens não oferece suporte a pontos de extremidade dinâmicos.

Ao aplicar o atributo [message] a declarações de procedimento remoto no arquivo IDL, você implementa automaticamente o enfileiramento de mensagens em modo assíncrono para essas chamadas. Isso possibilita que os aplicativos cliente e servidor controlem muitas das propriedades associadas a mensagens e filas de mensagens, incluindo:

  • Qualidade do serviço
  • Aviso de receção
  • Diário
  • Prioridade de chamada
  • Persistência da fila de processos do servidor

Qualidade de serviço é o esforço necessário que o transporte fará para entregar a chamada ao processo do servidor. Uma entrega expressa será colocada na fila na memória, por isso é bastante rápida, mas a chamada será perdida se um computador ou uma ligação de rede falhar no momento errado. Uma entrega recuperável será postada em um arquivo de disco até que seja entregue, para que a chamada não seja perdida, mesmo em face de uma falha do computador. Isso dá entrega garantida, mas a um custo em desempenho, pois cada chamada é gravada no disco.

Você também pode instruir o transporte MSMQ a aguardar a confirmação de que a chamada chegou à fila de destino (servidor) antes de retornar. Escolher esta opção bloqueia o cliente até que o servidor reconheça a chamada, caso contrário, o controle retorna ao cliente imediatamente após fazer a chamada.

Usando o registro no diário, as chamadas podem ser registradas no disco. Se o registo no diário estiver ativado, cada chamada será registada no disco enquanto é transmitida para a próxima etapa a caminho do processo do servidor.

A prioridade de chamada pode ser usada em conjunto com o atributo de função RPC [message] para permitir que chamadas com prioridade mais alta tenham precedência sobre chamadas com prioridade mais baixa, mesmo que as chamadas de alta prioridade cheguem mais tarde. A prioridade de chamada também funcionará de maneira limitada com RPC síncrono, mas as chamadas RPC síncronas não podem ser acumuladas da mesma maneira que as chamadas assíncronas.

O processo do cliente controla todas as propriedades acima chamando RpcBindingSetOption. Uma vez definidas, essas propriedades permanecem em vigor até que sejam alteradas em outra chamada para RpcBindingSetOption.

O processo do servidor RPC pode controlar o tempo de vida de sua fila de recebimento. Por padrão, a fila é excluída quando o processo do servidor é encerrado. No entanto, o processo do servidor pode usar RpcServerUseProtseqEpEx ao configurar o seu ponto de extremidade para indicar ao transporte que permita que a fila continue a existir e aceite pedidos de chamada, mesmo quando o processo do servidor não está em execução. Nesse caso, as chamadas são enfileiradas e executadas posteriormente, quando o processo do servidor volta a estar online.

Observação

Se estiveres a usar chamadas assíncronas [mensagem] numa interface, deves registar a interface chamando RpcServerRegisterIf ou RpcServerRegisterIfEx antes de chamar RpcServerUseProtseqEpEx(ncadg_mq). Depois de ativar a sequência de protocolo, todas as chamadas que já aguardam na fila para o servidor começarão a ser lidas fora da fila. Se a interface RPC correspondente não tiver sido registrada, as chamadas falharão. Essa situação pode acontecer se você tiver um ponto de extremidade permanente para suas chamadas de procedimento remoto, o servidor tiver sido desligado e os clientes continuarem a enviar chamadas para o servidor. Essas chamadas serão empilhadas na fila, esperando para serem lidas assim que o servidor voltar a ficar online.

 

Para obter mais informações, consulte RpcBindingSetOption, RpcServerUseProtseqEpExe [message], ncadg_mq.