Le message n'atteint pas MSMQ lorsqu'il est transactionnel
J'ai un privé MSMQ créé dans ma machine locale. Je suis de l'envoi de messages à la file d'attente à l'aide de code C# suivant. Quand j'ai changé la file d'attente pour être transactionnelle, le message n'est pas d'atteindre le MSMQ. Cependant, il n'y a aucune exception n'est levée dans la méthode d'envoi. Ce changement que je dois faire pour le faire fonctionner?
using System;
using System.Messaging;
using System.Data;
public partial class _Default : System.Web.UI.Page
{
//Sharing violation resulted from queue being open already for exclusive receive.
MessageQueue helpRequestQueue = new MessageQueue(@".\Private$\MyPrivateQueue", false);
protected void Page_Load(object sender, EventArgs e)
{
bool isTransactionalQueue = false;
if (!System.Messaging.MessageQueue.Exists(@".\Private$\MyPrivateQueue"))
{
System.Messaging.MessageQueue.Create(@".\Private$\MyPrivateQueue", isTransactionalQueue);
}
SendMessage();
GetAllMessages();
}
private void SendMessage()
{
System.Messaging.Message theMessage = new System.Messaging.Message("TimeNow is "+DateTime.Now.ToString());
theMessage.Label = "Lijo " + DateTime.Now.ToString();
theMessage.Priority = System.Messaging.MessagePriority.Normal;
helpRequestQueue.Send(theMessage);
}
private void GetAllMessages()
{
DataTable messageTable = new DataTable();
messageTable.Columns.Add("Label");
messageTable.Columns.Add("Body");
//Set Message Filters
MessagePropertyFilter filter = new MessagePropertyFilter();
filter.ClearAll();
filter.Body = true;
filter.Label = true;
filter.Priority = true;
helpRequestQueue.MessageReadPropertyFilter = filter;
//Get All Messages
System.Messaging.Message[] messages = helpRequestQueue.GetAllMessages();
System.Messaging.XmlMessageFormatter stringFormatter = new System.Messaging.XmlMessageFormatter(new string[] { "System.String" });
for (int index = 0; index < messages.Length; index++)
{
string test = System.Convert.ToString(messages[index].Priority);
messages[index].Formatter = stringFormatter;
messageTable.Rows.Add(new string[] {messages[index].Label,messages[index].Body.ToString() });
}
Gridview1.DataSource = messageTable;
Gridview1.DataBind();
}
private void ReceiveAndProcess()
{
}
}
source d'informationauteur Lijo
Vous devez vous connecter pour publier un commentaire.
Pour la file d'attente que vous avez créé comme transanctional, vous devez utiliser la version de Send() qui comprend le MessageQueueTransactionType paramètre. La plus grande frustration c'est qu'il ne jette pas des exceptions ou des erreurs comme vous l'avez vu, mais le message n'a tout simplement pas jamais.
Donc, dans votre code, changement:
à
Edit: Ma réponse est juste une autre façon de faire de côté de David.
Opérations ne fonctionnent pas sur les
non-transactional queues
. Si vous utilisez ce formulaire:Sur une file d'attente non transactionnelle, le message semble être perdu et qu'aucune exception n'est levée. Vous pouvez vérifier si une file d'attente est transactionnelle dans les propriétés de la file d'attente dans le Message Queueing de la console de gestion.
Il est préférable d'utiliser
Par MSDNvoici un exemple d'utilisation de la transaction de file d'attente MSMQ:
Vous devez le traiter comme un DB transaction -- début de la transaction par la création de la nouvelle MSMQ transaction, puis valider ou annuler l'opération.
File d'attente et le message doivent être à la même transactionnelles dans ce cas.
Si vous n'obtenez pas une exception alors en Négatif de la Source de la Journalisation dans votre code pour vous aider à trouver les messages perdus.