【问题标题】:Async calling a stored Proc using service Broker使用服务代理异步调用存储的 Proc
【发布时间】:2011-11-23 22:42:10
【问题描述】:

在我的应用程序中,我需要异步调用存储过程。 为此,我正在使用 Sql Service Broker。 这些是创建异步调用所涉及的步骤。

1) 我创建了消息、合同、队列、服务。 并发送消息。我可以在“ReceiveQueue1”中看到我的消息。

2) 我创建了一个存储过程和一个队列 当我执行 Stored Proc(proc_AddRecord) 时,它只执行一次。 它读取队列中的所有记录并将这些记录添加到表中。 到目前为止,它的工作正常。 但是当我向“ReceiveQueue1”添加一些新消息时,我的存储过程没有添加那些 自动记录到表中。我必须重新执行存储过程(proc_AddRecord) 为了添加新消息。为什么存储过程没有被执行。 为了异步调用存储过程,我应该做什么。 使用 Service Broker 的全部意义在于异步调用存储过程。 我对 SQL Server Service Broker 完全陌生。 感谢任何帮助。 这是我的存储过程代码

#
--exec proc_AddRecord

ALTER PROCEDURE proc_AddRecord
AS

Declare
    @Conversation UniqueIdentifier,
    @msgTypeName nvarchar(200),
    @msg varbinary(max)

While (1=1)
Begin
    Begin Transaction;

    WAITFOR
    (
        Receive Top (1) 
            @Conversation = conversation_handle,
            @msgTypeName =  message_type_name,
            @msg = message_body
        from dbo.ReceiveQueue1
    ), TIMEOUT 5000


    IF @@Rowcount = 0
        Begin 
            Rollback Transaction
            Break
        End
    PRINT  @msg
    If @msg = 'Sales'
        BEGIN
            insert into TableCity(deptNo,Manager,Group,EmpCount) VALUES(101,'Reeves',51, 29)
            COMMIT Transaction
            Continue
        End
    If @msg = 'HR'
        BEGIN
            insert into  TableCity(deptNo,Manager,Group,EmpCount) VALUES(102,'Cussac',55, 14)
            COMMIT Transaction
            Continue
        End

    Begin
        Print 'Process end of dialog messages here.'
        End Conversation @Conversation
        Commit Transaction
        Continue
    End
    Rollback Transaction
END

ALTER QUEUE AddRecorQueue
WITH ACTIVATION (
                PROCEDURE_NAME=proc_AddRecord,
                MAX_QUEUE_READERS = 1,
                STATUS = ON,
                EXECUTE AS 'dbo');

【问题讨论】:

    标签: sql-server-2005 asynchronous service-broker


    【解决方案1】:

    你说你正在执行存储过程,你不应该这样做,甚至一次都不需要,它应该总是通过激活来完成。

    如果您的激活是在您的“ReceiveQueue1”而不是“AddRecorQueue”上,我看不到您的其余代码,但名称暗示了它。

    您的存储过程在哪里开始和结束?一般来说,我会把 BEGIN 放在 AS 语句和 END 存储过程应该结束的位置之后,如果你没有这些,那么你需要一个 GO 语句来分隔它。否则,您的 ALTER QUEUE 语句将成为存储过程的一部分

    您还具有“回滚事务”,因此即使激活正在工作,它也会全部回滚,或者引发错误,指出如果触发了 IF 语句之一,则没有事务。

    我建议您一般关注this tutorial for service brokerthis one about internal activation。他们应该让你开始。

    【讨论】:

    • 太好了,我将激活添加到 ''ReceiveQueue1' 并且效果很好。我最后删除了回滚。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多