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Š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):
WITH ACTIVATION
(
STATUS=OFF
);
Drop proc dbo.sb_ProcessService;
Declare @i intVisual Studio (es strādāju ar 2010)
Set @i = 0
while @i < 100
Begin
Insert Into MyTable(Number) Values(@i)
Set @i = @i + 1;
End
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:
Ierakstīt komentāru