Condividi tramite


Sviluppo di applicazioni di accodamento RPC-Message

È necessario un piccolo sforzo per sfruttare il trasporto MSMQ nell'applicazione RPC. Per la messaggistica sincrona è necessario specificare solo il trasporto della coda di messaggi (ncadg_mq) come sequenza di protocollo. Il protocollo ncadg_mq supporta tutte le funzionalità standard del datagramma, ad eccezione delle chiamate di trasmissione. Si noti inoltre che attualmente il trasporto message-queue non supporta gli endpoint dinamici.

Applicando l'attributo [message] alle dichiarazioni di routine remote nel file IDL, si implementa automaticamente l'accodamento messaggi in modalità asincrona per tali chiamate. Ciò consente alle applicazioni client e server di controllare molte delle proprietà associate a messaggi e code di messaggi, tra cui:

  • Qualità del servizio
  • Riconoscimento della ricevuta
  • Diario
  • Priorità delle chiamate
  • Persistenza della coda dei processi del server

La qualità del servizio è lo sforzo che il trasporto effettuerà per recapitare la chiamata al processo del server. Una consegna rapida verrà messa in coda in memoria, quindi è abbastanza veloce, ma la comunicazione andrà persa se un computer o una connessione di rete si interrompe nel momento sbagliato. Una consegna ripristinabile verrà registrata su un file su disco fino alla sua effettuazione, quindi la chiamata non andrà persa, anche in caso di crash del computer. Ciò garantisce il recapito garantito, ma a un costo in termini di prestazioni, perché ogni chiamata viene scritta su disco.

È possibile anche indicare al trasporto MSMQ di attendere il riconoscimento che la chiamata abbia raggiunto la coda di destinazione (server) prima di tornare. La scelta di questa opzione blocca il client fino a quando il server non riconosce la chiamata, altrimenti il controllo torna al client immediatamente dopo aver effettuato la chiamata.

Usando l'inserimento nel journal, le chiamate possono essere registrate su disco. Se la registrazione nel log è attivata, ogni chiamata viene registrata su disco durante la trasmissione verso il processo del server.

La priorità di chiamata può essere usata insieme all'attributo della funzione RPC [message] per consentire alle chiamate con priorità più alta di avere la precedenza sulle chiamate con priorità più bassa, anche se le chiamate con priorità alta arrivano in un secondo momento. La priorità delle chiamate funzionerà anche in modo limitato con RPC sincrono, ma le chiamate RPC sincrone non possono essere sovrapposte allo stesso modo delle chiamate asincrone.

Il processo client controlla tutte le proprietà precedenti chiamando RpcBindingSetOption. Una volta impostate, queste proprietà rimangono attive fino a quando non vengono modificate in un'altra chiamata a RpcBindingSetOption.

Il processo del server RPC può controllare la durata della coda di ricezione. Per impostazione predefinita, la coda viene eliminata al termine del processo del server. Tuttavia, il processo del server può usare RpcServerUseProtseqEpEx durante la configurazione del relativo endpoint per indicare al trasporto di consentire alla coda di continuare a esistere e di accettare richieste di chiamata anche quando il processo del server non è in esecuzione. In questo caso, le chiamate vengono mettere in coda ed eseguite successivamente, appena il processo del server torna online.

Nota

Se si usano chiamate asincrone [message] in un'interfaccia, è necessario registrare l'interfaccia chiamando RpcServerRegisterIf o RpcServerRegisterIfEx prima di chiamare RpcServerUseProtseqEpEx(ncadg_mq). Dopo aver attivato la sequenza di protocollo, le chiamate già in attesa nella coda del server inizieranno a essere lette dalla coda. Se l'interfaccia RPC corrispondente non è stata registrata, le chiamate avranno esito negativo. Questa situazione può verificarsi se si dispone di un endpoint permanente per le chiamate di procedura remota, il server è stato arrestato e i client hanno continuato a inviare chiamate al server. Queste chiamate verranno sovrapposte nella coda, in attesa di essere lette dopo che il server torna online.

 

Per altre informazioni, vedere RpcBindingSetOption, RpcServerUseProtseqEpExe [messaggio], ncadg_mq.