Service Broker C# Wrapper Interface and Transactions
Service Broker has a really good C# wrapper interface that comes part of the samples on Codeplex. If you need to work with service broker objects in the managed world then I would recommend using the interface from the Codeplex Service Broker Samples.
Most samples I have seen demonstrate communicating within a single database, and hence use the SqlTransaction Class The code below is an example of sending a message to a SSB Service in a SqlTransaction.
1: private void SendMsgToSSB()
2: {
3: SqlConnection conn = null;
4: SqlTransaction tran = null;
5: Conversation dialog = null;
6: Service client = null;
7: string connString = "Persist Security Info = False; Integrated Security = True; Initial Catalog = MyServiceBrokerDB; Data Source = .; Connect Timeout = 30;"
8: try
9: {
10: conn = new SqlConnection(connString);
11: conn.Open();
12:
13: // Begin a transaction
14: tran = conn.BeginTransaction();
15:
16: // Create a service object
17: client = new Service("MyCoolService", conn, tran);
18: client.FetchSize = 1;
19:
20: // Begin a dialog with the MyCoolService
21: dialog = client.BeginDialog(
22: "MyCoolServiceTarget", null, "DEFAULT",
23: TimeSpan.FromMinutes(1), false, conn, tran);
24:
25: // Create request message
26: string outgoingBody = "my really cool msg that broker understands";
27: Message request = new Message("DEFAULT",
28: new MemoryStream(Encoding.UTF8.GetBytes(outgoingBody)));
29:
30: // Send the message to the service
31: dialog.Send(request, conn, tran);
32:
33: dialog.End(conn, tran);
34: tran.Commit();
35: }
36: catch (ServiceException svcEx)
37: {//deal with this pesky service exceptions
38: }
39: finally
40: {//clean up here close connections etc.
41: }
42: }
But in scenarios where the transaction needs to be elevated from a lightweight transaction to one that needs the aid of the DTC the SqlTransaction object is not going to cut it for you.
With a simple change (in bold and italicized) you can then support enlisting in a Distributed Transaction.
1: public void SendMsgToSSB()
2: {
3: SqlConnection conn = null;
4: Conversation dialog = null;
5: Service client = null;
6: string ConnectionString = "Persist Security Info = False; Integrated Security = True; Initial Catalog = MyServiceBrokerDB; Data Source = .; Connect Timeout = 30;";
7: try
8: {
9: conn = new SqlConnection(ConnectionString);
10: if (conn.State != ConnectionState.Open)
11: {
12: conn.Open();
13: }
14: conn.EnlistTransaction(Transaction.Current);
15:
16: // Create a service object
17: client = new Service("MyCoolService", conn, null);
18: client.FetchSize = 1;
19:
20: // Begin a dialog with the MyCoolService
21: dialog = client.BeginDialog(
22: "MyCoolServiceTarget", null, "DEFAULT",
23: TimeSpan.FromMinutes(1), false, conn, null);
24:
25: // Create request message
26: string outgoingBody = "my really cool msg that broker understands";
27: Message request = new Message("DEFAULT",
28: new MemoryStream(Encoding.UTF8.GetBytes(outgoingBody)));
29:
30: dialog.Send(request, conn, null);
31: dialog.End(conn, null);
32: }
33: catch (ServiceException ex)
34: { //deal with the exception
35: }
36: finally
37: { //clean up
38: }
39: }
Again this code has a small issue what about if there is no Transaction available then sending a message without a transaction could be a bad thing. With one more change its ready to support both scenarios.
1: public void SendMsgToSSB()
2: { SqlTransaction tran = null;
3: SqlConnection conn = null;
4: Conversation dialog = null;
5: Service client = null;
6: string ConnectionString = "Persist Security Info = False; Integrated Security = True; Initial Catalog = MyServiceBrokerDB; Data Source = .; Connect Timeout = 30;";
7: try
8: {
9: conn = new SqlConnection(ConnectionString);
10: if (conn.State != ConnectionState.Open)
11: {
12: conn.Open();
13: }
14: if (Transaction.Current != null)
15: {
16: conn.EnlistTransaction(Transaction.Current);
17: }
18: else
19: {
20: tran = conn.BeginTransaction();
21: }
22:
23: // Create a service object
24: client = new Service("MyCoolService", conn, null);
25: client.FetchSize = 1;
26:
27: // Begin a dialog with the MyCoolService
28: dialog = client.BeginDialog(
29: "MyCoolServiceTarget", null, "DEFAULT",
30: TimeSpan.FromMinutes(1), false, conn, null);
31:
32: // Create request message
33: string outgoingBody = "my really cool msg that broker understands";
34: Message request = new Message("DEFAULT",
35: new MemoryStream(Encoding.UTF8.GetBytes(outgoingBody)));
36:
37: dialog.Send(request, conn, null);
38: dialog.End(conn, null);
39: if (tran != null)
40: {
41: tran.Commit();
42: }
43: }
44: catch (ServiceException ex)
45: { //deal with the exception
46: }
47: finally
48: { //clean up
49: }
50: }
I have also been making a few changes to the interface that I intend to publish shortly.
2 Responses to Service Broker C# Wrapper Interface and Transactions
Tags
.net .net4 Addins apple Biztalk BizTalk Express C# Caching cch harmony launch party Comic Development Dilbert distributed entity framework extensions firefox 3 flickr flickrlight General Go Live Rituals in memory iphone2 iphone 3g Linq To Sql MAF Managed Addin Framework Mapped Drive to UNC NServiceBus Oslo Plugins point case estimation project estimation Run As Administrator silverlight sky diving soa SQL Server Training UAC Velocity Vista Visual Studio wcf wf wwdc 2008





Quite inspiring,
Thanks
I used the SQLBroker Interface and with the above sample was able to send the message to the queue too but am not able to receive it. The queue has the message. Any suggestions?