Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Managed Instance
De flesta Service Broker-program följer samma grundläggande steg för att ta emot och bearbeta meddelanden:
Programmet påbörjar en transaktion.
Om programmet behåller tillståndet hämtar programmet en konversationsgruppsidentifierare. Programmet använder den här identifieraren för att återställa tillståndet från en tillståndstabell. Om det inte finns någon konversationsgrupp med meddelanden som är redo att tas emot återställs transaktionen och avslutas.
Programmet tar emot ett eller flera meddelanden från kön. Om programmet har en konversationsgruppsidentifierare använder programmet konversationsgruppidentifieraren för att ta emot meddelanden för den konversationsgruppen. Om inga fler meddelanden är tillgängliga för att tas emot checkar programmet in transaktionen och återgår till steg 1.
Programmet validerar innehållet i meddelandena baserat på namnet på meddelandetypen.
Programmet bearbetar meddelandena baserat på meddelandetypens namn och innehållet i meddelandet.
Programmet skickar alla meddelanden som är resultatet av bearbetningen.
Om programmet upprätthåller tillståndet uppdaterar programmet tillståndstabellen med hjälp av konversationsgruppidentifieraren som primärnyckel för tabellen.
Programmet återgår till steg 3 för att kontrollera om fler meddelanden är tillgängliga.
Programmets exakta struktur beror på programmets krav, programmets kommunikationsstil, om programmet är en måltjänst eller en initierande tjänst och om Service Broker aktiverar programmet eller inte.
Ett initierande program skickar till exempel ett meddelande innan det startar bearbetningsloopen som beskrivs i föregående steg. Den initierande tjänsten kan skicka ett meddelande från ett annat program eller en lagrad procedur och sedan använda en aktiverings lagrad procedur för att initiera tjänstkön. Ett orderinmatningsprogram kan till exempel innehålla ett externt program som initierar konversationen för att ange ordern. När beställningen har angetts behöver det externa programmet inte fortsätta att köras. En lagrad aktiveringsprocedur för den initialiserande tjänsten skickar orderbekräftelsen när ett svar returneras från ordertjänsten. Den aktiva lagrade proceduren bearbetar även eventuella Service Broker-felmeddelanden som returneras av måltjänsten och skickar meddelanden om att ordern inte kunde bekräftas.
I stället för att skicka ett meddelande från ett annat program kan det initierande programmet skicka ett meddelande och sedan starta bearbetningsloopen som en del av samma program. Oavsett dessa variationer förblir den grundläggande konturen densamma.
Ett program som bearbetar ett stort antal meddelanden i samma konversationsgrupp kan behålla antalet mottagna meddelanden och genomföra en transaktion efter bearbetning av ett visst antal meddelanden. Med hjälp av räkna-och-godkänna-strategi kan programmet hålla transaktionerna relativt korta och göra det möjligt för programmet att bearbeta olika konversationsgrupper.
Examples
Följande Transact-SQL exempel bearbetar alla meddelanden i kön MyServiceQueue. Bearbetningen av meddelandet är minimal. Om meddelandet är ett EndDialog- eller Felmeddelande meddelande avslutar koden konversationen. För andra meddelanden skapar koden en XML-representation av meddelandet och skapar en resultatuppsättning som innehåller konversationshandtaget, meddelandetypens namn och XML. När inga meddelanden är tillgängliga för 500 millisekunder avslutas koden.
För enkelhetens skull skapar skriptet en resultatuppsättning för varje meddelande. Om ett fel uppstår när du läser från kön, för skriptet in ändringarna utan att skapa något resultat. Därför tar det här skriptet tyst bort alla meddelanden som orsakar ett fel.
Notera
Eftersom skriptet helt enkelt visar meddelanden är inga giftmeddelanden möjliga för det här skriptet. Därför innehåller skriptet inte kod för att hantera giftmeddelanden. Ett produktionsprogram ska skrivas för att hantera giftmeddelanden. Mer information om giftmeddelanden finns i Hantera giftmeddelanden.
Notera
Kodexemplen i den här artikeln har testats med hjälp av AdventureWorks2025 exempeldatabas som du kan ladda ned från Microsoft SQL Server-exempel och Community Projects startsida.
USE [AdventureWorks2022];
GO
-- Process all conversation groups.
WHILE (1 = 1)
BEGIN
DECLARE @conversation_handle AS UNIQUEIDENTIFIER,
@conversation_group_id AS UNIQUEIDENTIFIER,
@message_body AS XML,
@message_type_name AS NVARCHAR (128);
-- Begin a transaction, one per conversation group.
BEGIN TRANSACTION;
-- Get next conversation group.
WAITFOR (GET CONVERSATION GROUP
@conversation_group_id FROM [MyServiceQueue]),
TIMEOUT 500;
-- Restore the state for this conversation group here
-- If there are no more conversation groups, break.
IF @conversation_group_id IS NULL
BEGIN
ROLLBACK;
BREAK;
END
-- Process all messages in the conversation group.
WHILE 1 = 1
BEGIN
-- Get the next message.
RECEIVE TOP (1)
@conversation_handle = [conversation_handle],
@message_type_name = [message_type_name],
@message_body = CASE
WHEN [validation] = 'X' THEN CAST ([message_body] AS XML)
ELSE CAST (N'<none/>' AS XML)
END
FROM [MyServiceQueue]
WHERE CONVERSATION_GROUP_ID = @conversation_group_id;
-- If there is no message, or there is an error
-- reading from the queue, break.
IF @@ROWCOUNT = 0
OR @@ERROR <> 0
BREAK;
-- Process the message. In this case, the program ends the conversation
-- for Error and EndDialog messages. For all other messages, the program
-- produces a result set with information about the message.
SELECT @conversation_handle,
@message_type_name,
@message_body;
-- If the message is an end dialog message or an error,
-- end the conversation. Notice that other conversations
-- in the same conversation group may still have messages
-- to process. Therefore, the program does not break after
-- ending the conversation.
IF @message_type_name = 'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
OR @message_type_name = 'https://schemas.microsoft.com/SQL/ServiceBroker/Error'
BEGIN
END CONVERSATION @conversation_handle;
END
END -- Process all messages in conversation group.
COMMIT TRANSACTION;
END -- Process all conversation groups.