开发RPC-Message队列应用程序

利用 RPC 应用程序中的 MSMQ 传输几乎不需要付出任何努力。 对于同步消息传送,只需将消息队列传输 (ncadg_mq) 指定为协议序列。 ncadg_mq协议支持除广播调用之外的所有标准数据报功能。 另请注意,消息队列传输目前不支持动态终结点。

通过将 [message] 属性应用于 IDL 文件中的远程过程声明,可以自动实现这些调用的异步模式消息队列。 这使得客户端和服务器应用程序能够控制许多与消息和消息队列关联的属性,包括:

  • 服务质量
  • 确认回执
  • 日志
  • 呼叫优先级
  • 服务器进程队列的持久性

服务质量是传输为将调用传递到服务器进程而付出的努力。 快递将在内存中排队,因此速度相当快,但如果计算机或网络连接在错误时间断开,呼叫将丢失。 可恢复的传递将发布到磁盘文件,直到它传递,因此即使遇到计算机崩溃,呼叫也不会丢失。 这提供有保证的传递,但在每次调用都写入磁盘时会降低性能。

还可以告诉 MSMQ 传输等待确认调用到达目标 (服务器) 队列,然后再返回。 选择此选项会阻止客户端,直到服务器确认调用,否则控件在发出调用时立即返回给客户端。

通过使用日记功能,可将调用记录到磁盘。 如果启用了日记功能,则每次调用都会记录到磁盘,因为它在传输到服务器进程的过程中的下一跃点。

调用优先级可与 RPC [message] 函数属性结合使用,以允许优先级较高的调用优先于优先级较低的调用,即使高优先级调用稍后到达也是如此。 调用优先级也以有限方式使用同步 RPC,但同步 RPC 调用不能以与异步调用相同的方式堆叠起来。

客户端进程通过调用 RpcBindingSetOption 来控制上述所有属性。 设置后,这些属性将一直有效,直到在 对 RpcBindingSetOption 的另一次调用中更改它们。

RPC 服务器进程可以控制其接收队列的生存期。 默认情况下,当服务器进程退出时,会删除队列。 但是,服务器进程在设置其终结点时可以使用 RpcServerUseProtseqEpEx ,以告知传输允许队列继续存在,并接受呼叫请求,即使服务器进程未运行也是如此。 在这种情况下,当服务器进程恢复联机时,调用将排队并稍后执行。

注意

如果在接口中使用异步 [message] 调用,则必须在调用 RpcServerUseProtseqEpEx (ncadg_mq) 之前,通过调用 RpcServerRegisterIfRpcServerRegisterIfEx 来注册接口。 打开协议序列后,已在队列中等待服务器的任何调用都将开始从队列中读出。 如果相应的 RPC 接口尚未注册,则调用将失败。 如果为远程过程调用设置了永久终结点,服务器已关闭,并且客户端继续向服务器发送调用,则可能会出现这种情况。 这些调用将堆叠在队列中,等待服务器重新联机后读取。

 

有关详细信息,请参阅 RpcBindingSetOptionRpcServerUseProtseqEpEx 和 [message], ncadg_mq