Skip to main content

MSMQ - mesaje in format XML

MSMQ este folosit foarte des folosit în aplicațiile destok pentru a comunica intre doua sau mai multe procese. Citirea si scrierea unui mesaj in MSMQ se face extrem de simplu:
//Creare de mesaj.
System.Messaging.Message message = new System.Messaging.Message();
message.Body = "some text";
message.Label = "Test message";

//Initializare MSMQ.
var msmq;
if(MessageQueue.Exists(@".\Private$\NumeQueue"))
{
msmq = new System.Messaging.MessageQueue(@".\Private$\NumeQueue");
}
else
{
msmq = MessageQueue.Create(@".\Private$\NumeQueue");
}

/Trimitere mesaj
msmq.Send(message);.

/Citire mesaj.
try
{
message = mq.Receive(new TimeSpan(0, 0, 10));
}
catch
{
//Executa ceva in caz de eroare.
}
Pentru a primii un mesaj, putem sa ne inregistram la evenimentul "ReceiveCompleted" a unui MessageQueue.

Daca o sa încercam sa trimitem prin MSMQ un mesaj cu conținut XML de genul:
<Text>
<Valoare>Test</Valoare>
</Text>
o sa observam ca pe MSMQ a ajuns un mesaj de forma:
&lt;Text&gt;
&lt;Valoare&gt;Test&lt;/Valoare&gt;
&lt;/Text&gt;
Cea ce s-a întîmplat este normal, doar ca noi ne-am astepta sa obtinem prima varianta in momentul in care primim din MSMQ mesajul. O solutie rapida si la indemana este sa setam Formatter in momentul in care generam mesajul ca un obiect de tip ActiveXMessageFormatter.
System.Messaging.Message message = new System.Messaging.Message();
message.Formatter = new ActiveXMessageFormatter();
message.Body = "some text";
message.Label = "Test message";
Trebuie avut grija doar ca in momentul in care cream obiectul pentru a citi din MSMQ sa setam propietatea"Formatter".
if(MessageQueue.Exists(@".\Private$\NumeQueue"))
{
msmq = new System.Messaging.MessageQueue(@".\Private$\NumeQueue");
}
else
{
msmq = MessageQueue.Create(@".\Private$\NumeQueue");
}
msmq..Formatter = new ActiveXMessageFormatter();

Principalul avantaj este ca prin acest mod mesajele o sa poat sa fie consumate de catre COM-uri, totodată pe MSMQ dacă vizualizam mesaje din "Computer Management" o sa putem vedea conținutul lor clar, fără encoding. Un alt avantaj este modul de serializare pentru ActiveX, care este un mod foarte compact, a.i. mesajul o sa aibe o dimensiune foarte mica.

Comments

Popular posts from this blog

How to check in AngularJS if a service was register or not

There are cases when you need to check in a service or a controller was register in AngularJS.
For example a valid use case is when you have the same implementation running on multiple application. In this case, you may want to intercept the HTTP provider and add a custom step there. This step don’t needs to run on all the application, only in the one where the service exist and register.
A solution for this case would be to have a flag in the configuration that specify this. In the core you would have an IF that would check the value of this flag.
Another solution is to check if a specific service was register in AngularJS or not. If the service was register that you would execute your own logic.
To check if a service was register or not in AngularJS container you need to call the ‘has’ method of ‘inhector’. It will return TRUE if the service was register.
if ($injector.has('httpInterceptorService')) { $httpProvider.interceptors.push('httpInterceptorService&#…

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine:
threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration:

TeamCity.NET 4.51EF 6.0.2VS2013
It seems that there …

Entity Framework (EF) TransactionScope vs Database.BeginTransaction

In today blog post we will talk a little about a new feature that is available on EF6+ related to Transactions.
Until now, when we had to use transaction we used ‘TransactionScope’. It works great and I would say that is something that is now in our blood.
using (var scope = new TransactionScope(TransactionScopeOption.Required)) { using (SqlConnection conn = new SqlConnection("...")) { conn.Open(); SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = conn; sqlCommand.CommandText = ... sqlCommand.ExecuteNonQuery(); ... } scope.Complete(); } Starting with EF6.0 we have a new way to work with transactions. The new approach is based on Database.BeginTransaction(), Database.Rollback(), Database.Commit(). Yes, no more TransactionScope.
In the followi…