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 protocolli. Il protocollo ncadg_mq supporta tutte le funzionalità di datagrammi standard, ad eccezione delle chiamate di trasmissione. Si noti inoltre che attualmente il trasporto della coda di messaggi non supporta endpoint dinamici.
Applicando l'attributo [message] alle dichiarazioni di procedure remote nel file IDL, si implementa automaticamente l'accodamento 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 ricezione
- Inserimento nel journal
- Priorità della chiamata
- Persistenza della coda dei processi server
La qualità del servizio è lo sforzo che il trasporto farà per recapitare la chiamata al processo del server. Un recapito rapido verrà accodato in memoria, quindi è abbastanza veloce, ma la chiamata verrà persa se un computer o una connessione di rete viene interrotta al momento sbagliato. Un recapito recuperabile verrà pubblicato in un file del disco finché non viene recapitato, quindi la chiamata non verrà persa, anche in caso di arresto anomalo del computer. In questo modo viene fornito un recapito garantito, ma a un costo in termini di prestazioni quando ogni chiamata viene scritta su disco.
È anche possibile indicare al trasporto MSMQ di attendere che la chiamata abbia raggiunto la coda di destinazione (server) prima di restituire. La scelta di questa opzione blocca il client fino a quando il server riconosce la chiamata, altrimenti il controllo restituisce al client immediatamente dopo aver effettuato la chiamata.
Usando il journaling, le chiamate possono essere registrate su disco. Se il journaling viene attivato, ogni chiamata viene registrata su disco perché viene trasmessa all'hop successivo nel modo in cui viene eseguito il processo del server.
La priorità delle chiamate può essere usata insieme all'attributo di funzione RPC [message] per consentire alle chiamate con priorità più alta di avere la precedenza sulle chiamate con priorità inferiore, anche se le chiamate con priorità elevata arrivano in un secondo momento. La priorità delle chiamate funzionerà anche in modo limitato con RPC sincrona, ma le chiamate RPC sincrone non possono sovrapporsi allo stesso modo delle chiamate asincrone.
Il processo client controlla tutte le proprietà precedenti chiamando RpcBindingSetOption. Una volta impostate, queste proprietà rimangono effettive finché 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 quando il processo del server viene chiuso. Tuttavia, il processo del server può usare RpcServerUseProtseqEpEx durante la configurazione dell'endpoint per indicare al trasporto di consentire alla coda di continuare a esistere e accettare richieste di chiamata anche quando il processo del server non è in esecuzione. In questo caso, le chiamate vengono accodate ed eseguite in un secondo momento, quando 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 della coda per il server inizieranno a essere lette fuori 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, RpcServerUseProtseqEpEx e [message], ncadg_mq.