队列发布者与队列订阅者
如果发布事件或订阅事件时不使用同步绑定,可以使用NetMsmqBinding。一个队列发布-订阅服务组合了松散耦合系统的优势,以及离线执行(Disconnected Execution)的灵活性。当然,使用队列事件时,契约的所有事件需要被标记为单向操作。如图B-3所示,我们可以让队列的两端保持独立。

图B-3 队列发布-订阅
我们可以使用一个队列发布者和联机的同步订阅者,也可以让一个联机的发布者发布给队列订阅者,或者同时为队列发布者与队列订阅者。然而需要注意的是,我们不能使用队列的临时订阅,因为它不支持MSMQ绑定下的双向回调,从而无法使用通信的断开特性。如前所示,我们也可以使用管理工具管理订阅者,管理的操作仍然是联机的,以及同步的。
队列发布者
如果要使用一个队列发布者,那么在发布服务时,需要使用MSMQ绑定暴露一个队列终结点。当队列发布者触发事件时,发布服务可以为离线状态,或者发布的客户端自身可以是断开的。注意,当发布两个事件到队列发布服务中时,并不能保证它们传递的顺序,以及终端订阅者对这些事件的处理。只有当事件契约被配置为一个会话服务时,并且只有在处理一个单独的发布服务时,我们才能够假定发布的顺序。
队列订阅者
要部署一个队列订阅者,持久订阅服务需要暴露一个队列终结点。即使发布者为联机状态,这样做也能够使得它处于离线状态。当订阅者再次联机时,就会收到所有排队等候的事件。此外,当发布服务自身为断开状态时,队列订阅者也能够处理,因为并没有事件被丢失。在一个单独的队列订阅者中,如果触发多个事件,无法保证事件传递的顺序。如果事件契约拥有一个会话,则订阅者只能假定发布的顺序。当然,如果同时为队列发布者与队列订阅者,则允许它们在同一时间可以脱机工作。