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ê precisa especificar apenas o transporte de fila de mensagens (ncadg_mq) como a sequência de protocolo. O protocolo ncadg_mq dá suporte a todos os recursos de datagrama padrão, exceto chamadas de difusão. Além disso, observe que atualmente o transporte de fila de mensagens não dá suporte a pontos de extremidade dinâmicos.

Aplicando o atributo [message] a declarações de procedimento remoto no arquivo IDL, você implementa automaticamente o enfileiramento de mensagens de 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
  • Confirmação do recebimento
  • Registro no diário
  • Prioridade de chamada
  • Persistência da fila de processo do servidor

A qualidade do serviço é o esforço que o transporte fará para entregar a chamada ao processo do servidor. Uma entrega expressa será enfileirada na memória, portanto, é bastante rápida, mas a chamada será perdida se uma conexão de computador ou rede falhar na hora errada. Uma entrega recuperável será postada em um arquivo de disco até que seja entregue, portanto, a chamada não será perdida, mesmo diante de uma falha do computador. Isso oferece entrega garantida, mas a um custo de desempenho, pois cada chamada é gravada em disco.

Você também pode informar o transporte MSMQ para aguardar a confirmação de que a chamada atingiu a fila de destino (servidor) antes de retornar. Escolher essa opção bloqueia o cliente até que o servidor reconheça a chamada; caso contrário, o controle retornará ao cliente imediatamente ao fazer a chamada.

Usando o registro em diário, as chamadas podem ser registradas em disco. Se o registro em diário estiver ativado, cada chamada será registrada em disco conforme ela for transmitida para o próximo salto no caminho para o 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íncrona, mas as chamadas RPC síncronas não podem ser empilhadas da mesma maneira que as chamadas assíncronas.

O processo do cliente controla todas as propriedades acima chamando RpcBindingSetOption. Depois de definidas, essas propriedades permanecem em vigor até serem 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 seu ponto de extremidade para informar o transporte para permitir que a fila continue a existir e aceitar solicitações de chamada mesmo quando o processo do servidor não estiver em execução. Nesse caso, as chamadas são enfileiradas e executadas posteriormente, quando o processo do servidor volta a ficar online.

Observação

Se você estiver usando chamadas assíncronas [mensagem] em uma interface, deverá registrar 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á estão aguardando a fila do 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 uma configuração de 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, aguardando para serem lidas quando o servidor voltar a ficar online.

 

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