otrdiena, 2011. gada 8. novembris

Service Broker: CLR

Šajā rakstā piemērs, kā apstrādāt rindas elementus no .NET. Manuprāt labākais no raksta ir tas, ka parādīts, cik vienkārši ir izveidot lietojumu, kas strādā ar Service Broker (SB) servisiem.

Codeplex lapā (par SQL Server tēmu šeit) ir citu izveidoti projekti un piemēri, ko iespējams bez maksas lejupielādēt un arī lietot. Šim rakstam ir izmantots ServiceBrokerInterface. (SQL SB sakarā ir pieejams rīks, kas, iespējams, atvieglo darbu ar SB servisiem šeit. Es gan neesmu īsti iemēģinājis).

Sagatavošanās darbi datu bāzē
Pirms sākt darbu, izveidoju datu bāzi un palaidu skriptus no raksta Service Broker: asinhrons trigeris. Tā kā šajā rakstā izveidotais piemērs apstrādās ziņojumus, kas sūtīti uz ProcessService, tad nav nepieciešama apstrādes procedūra SQL Server pusē.
Tātad, lai atteiktos no aktivizācijas SQL Server datu bāzē un izdzēstu ProcessService ziņojumu apstrādes procedūru, papildus jāpalaiž skriptus:
ALTER QUEUE dbo.ProcessQueue
    WITH ACTIVATION
    (
        STATUS=OFF
    );
Drop proc dbo.sb_ProcessService;
Šajā brīdī SQL Server pusē trigeris jau strādā, tā kā droši var ievietot arī datus tabulā. Tā kā eksperimenta nolūkos izmantoju SQL Server 2005 Express, tad datu ievietošas skripts nedaudz atšķiras no Service Broker: asinhrons trigeris rakstā esošā (viss pārējais T-SQL kods ir identisks):
Declare @i int
Set @i = 0
while @i < 100
Begin
    Insert Into MyTable(Number) Values(@i)
    Set @i = @i + 1;
End
Visual Studio (es strādāju ar 2010)
Izveidoju nelielu Console lietojumu, kuru palaižot tas sāk gaidīt, kad Service Broker rindā parādīsies jauni ziņojumi. Ja tādi parādās- apstrādā tos (ja 5 min nekas neparādas, darbs tiek beigts).
"Solution Explorer" tas izskatās šādi (ServiceBrokerInterface ir lejupielādēts un pielikts projektam):


Un .NET kods ir šāds (Manuprāt nav nepieciešams neko vairāk komentēt):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Samples.SqlServer;
using System.Data.SqlClient;
using System.IO;

namespace SBBlogam
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection con = new SqlConnection("Ieraksti ko vajag");
            con.Open();
            MyService s = new MyService(con);
            s.Run(true, con, null);
        }

        class MyService : Service
        {
            public MyService(SqlConnection con)
                : base("ProcessService", con)
            {
                // gaidīs ziņas piecas min. ja nekas neparādās- beidz darbu
                this.WaitforTimeout = TimeSpan.FromMinutes(5);
            }

            [BrokerMethod("DEFAULT")]
            public void Apstradat(Message msg, SqlConnection con, SqlTransaction tran)
            {
                TextReader reader = new StreamReader(msg.Body, Encoding.Unicode);
                string recMsg = reader.ReadToEnd();
                Console.WriteLine(recMsg);
                msg.Conversation.Send(msg, con, tran); // atbildes ziņojums
                msg.Conversation.End(con, tran);
            }
        }
    }
}

Un rezultāti:

Nav komentāru:

Komentāra publicēšana