Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » QAnywhere » QAnywhere 参考 » QAnywhere SQL API 参考 » 消息属性、标头和内容 » 消息标头

 

ml_qa_getredelivered

返回一个指明此消息是否以前接收过但未进行确认的值。

参数
说明 注释
1 消息 ID VARCHAR(128)。可从 ml_qa_createmessage 或 ml_qa_getmessage 获取消息 ID。
返回值

以 BIT 表示重新传送的值。值 1 表示正在重新传送消息;值 0 表示现在未重新传送消息。

注释

如果某消息以前被接收过但未进行确认,则可以重新传送该消息。例如,该消息已被接收,但接收该消息的应用程序还未处理完消息内容就崩溃了。这种情况下,QAnywhere 将消息标记为重新传送,以警告接收方注意该消息可能只处理了一部分。

例如,假定消息的接收过程分三个步骤完成:

  1. 由使用非事务性 QAnywhere Manager 的应用程序接收消息。

  2. 该应用程序将消息内容和消息 ID 写入名为 T1 的数据库表,然后提交更改。

  3. 应用程序确认消息。

如果应用程序在第 1 步和第 2 步之间或第 2 步和第 3 步之间发生故障,则消息将在应用程序重新启动时重新传送。

如果在第 1 步和第 2 步之间发生故障,则应通过运行第 2 步和第 3 步来处理重新传送的消息。如果在第 2 步和第 3 步之间发生故障,则消息已得到处理,仅需您确认。

要确定应用程序发生故障时发生了何种情况,可让应用程序调用 ml_qa_getredelivered,以检查以前是否重新传送过此消息。只有重新传送的消息需要在表 T1 中查找。比起让应用程序访问已接收消息的消息 ID 以查看此消息是否在表 T1 中,这样做效率更高,原因是应用程序故障很少发生。

接收消息后就可以读取此标头,一直到执行回退或提交;执行回退或提交后就不能再读取此标头。

另请参见
示例

在下面的示例中,收到一条消息;如果该消息以前传送过但未收到,则将消息 ID 输出到数据库服务器消息窗口:

begin
    declare @msgid varchar(128);
    declare @redelivered bit;
    set @msgid = ml_qa_getmessage( 'myaddress' );
    set @redelivered = ml_qa_getredelivered( @msgid );
    if @redelivered = 1 then
        message 'message with message ID ' || @msgid || ' has been redelivered';
    end if;
    commit;
end