消息传递

XMS 支持消息传递的持久和非持久方式,以及消息的异步和同步传递。

消息传递方式

XMS 支持两种消息传递方式:
持久
持久消息都会传递一次。 消息传递服务器会采取特殊的预防措施(例如,记录消息),以确保在传输过程中不会丢失持久消息,即使在发生故障的情况下也是如此。
非持久
非持久消息最多传递一次。 与持久消息相比,非持久消息的可靠性差一些,因为可能由于发生故障而导致在传输过程中丢失非持久消息。

可通过权衡可靠性与性能来选择合适的传递方式。 通常,非持久消息比持久消息传输得更快。

异步消息传递

XMS 使用一个线程来处理会话的所有异步消息传递。 这意味着每次只能运行一个消息侦听器函数或一个 onMessage() 方法。

如果会话中的多个消息使用者正在异步接收消息,并且消息侦听器函数或 onMessage() 方法正在将消息传递给某个消息使用者,那么等待同一消息的其他消息使用者必须继续等待。 等待传递给会话的其他消息也必须继续等待。

如果应用程序需要并行传递消息,请创建多个会话,以便 XMS 使用多个线程来处理异步消息传递。 通过使用这种方式,可同时运行多个消息侦听器函数或 onMessage() 方法。

无法通过将消息侦听器分配给使用者来使会话异步。 只有在调用 Connection.Start 方法时,才能使会话异步。 在调用 Connection.Start 方法之前,允许所有同步调用。 在调用 Connection.Start 时,会开始将消息传递给使用者。

如果必须在异步会话上进行同步调用 (例如,创建使用者或生产者) ,那么必须调用 Connection.Stop 。 可以通过调用 Connection.Start 方法来恢复会话,以开始传递消息。 这里的唯一例外情况是 Session 消息传递线程(即将消息传递到回调函数的线程)。 这个线程可以在消息回调函数中对会话发出任何调用(Close 调用除外)。

注: 在非受管方式下, IBM® MQ .NET 客户机不支持回调函数中的 MQDISC 调用。 因此,客户机应用程序无法在异步接收方式下在 MessageListener 回调内创建或关闭会话。 可在 MessageListener 方法外创建和处置会话。

同步消息传递

如果应用程序使用 MessageConsumer 对象的 Receive 方法,那么会将消息同步传递到该应用程序。

通过使用 Receive 方法,应用程序可以在指定的时间段内等待消息,也可以无限期地等待。 或者,如果应用程序不想等待消息,那么可以使用“Receive with No Wait”方法。