Gå til innhold

MS Message Queuing *LØST*


Anbefalte innlegg

Skrevet (endret)

ref https://www.diskusjon.no/index.php?showtopic=712378

 

jorn79: Jeg har kommet litt lenger med koden etter jeg sendte deg PM.

 

Jeg har gitt opp pipes i .NET og skal prøve meg på MQ i stedet. Jeg får kompilert koden under, men jeg får en feil ved kjøring. VS klager på linja MQ.BeginReceive(); (under GoServer())og mener den er på "ugyldig format" (jeg har norsk språkpakke til .net 2.0). Hva er galt?

 

Etter det jeg kan se, så trenger vel ikke noen spesiell lytter for å motta meldinger, iom at MessageQueue har ReceiveCompleted-event?

 

Dette er egentlig bare et testprogram for å se om jeg fikk MSMQ til å fungere. Første instans av programmet oppretter køen og fungerer som server. Andre instans fungerer som klient og skal kun overføre en melding til server. Server skal i teorien vise meldinga i en MessageBox, men programmet feiler før de kommer så langt. Så aner ikke om det vil fungere slik jeg vil det skal gjøre.

 

Form1.cs

Klikk for å se/fjerne innholdet nedenfor
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace wmqcs
{
   public partial class Form1 : Form
   {
       string qpath = Environment.MachineName + @"\Private$\testq";
       bool server = false;
       public Form1()
       {
           InitializeComponent();
           MQ.Formatter = new MQFormat();            
           if (ChooseMode()) //true = server, false = client
               GoServer();
           else
               GoClient();
       }
       private void GoServer()
       {
           MQ.BeginReceive();
       }
       private void GoClient()
       {
           MQ.Send(Environment.TickCount.ToString());
       }
       private bool ChooseMode()
       {
           if (!System.Messaging.MessageQueue.Exists(qpath))
           {
               System.Messaging.MessageQueue.Create(qpath, false);
               MQ.DenySharedReceive = true;
               MQ.ReceiveCompleted += new System.Messaging.ReceiveCompletedEventHandler(MQ_ReceiveCompleted);                
               label1.Text = "Server";
               server = true;
               return true;
           }
           else
           {
               MQ.Path = qpath;
               label1.Text = "Client";
               return false;
           }
       }

       void MQ_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e)
       {
           MessageBox.Show(e.Message.Body.ToString());
           MQ.BeginReceive();
       }

       private void Form1_FormClosing(object sender, FormClosingEventArgs e)
       {
           if (server && System.Messaging.MessageQueue.Exists(qpath))
               System.Messaging.MessageQueue.Delete(qpath);
       }
   }
}

MQ er et objekt av typen System.Messaging.MessageQueue.

 

MQFormat.cs (for å definere eget format på meldingene)

Klikk for å se/fjerne innholdet nedenfor
using System;
using System.Collections.Generic;
using System.Text;
using System.Messaging;
using System.IO;

namespace wmqcs
{
   public class MQFormat : IMessageFormatter
   {
       public MQFormat()
       {

       }
       public void Write(System.Messaging.Message msg, object obj)
       {
           //Declare a buffer.
           byte[] buff;

           //Place the string into the buffer using UTF8 encoding.
           buff = Encoding.UTF8.GetBytes(obj.ToString());

           //Create a new MemoryStream object passing the buffer.
           Stream stm = new MemoryStream(buff);

           //Assign the stream to the message's BodyStream property.
           msg.BodyStream = stm;
       }
       public object Read(System.Messaging.Message msg)
       {
           //Obtain the BodyStream for the message.
           Stream stm = msg.BodyStream;

           //Create a StreamReader object used for reading from the stream.
           StreamReader reader = new StreamReader(stm);

           //Return the string read from the stream.
           //StreamReader.ReadToEnd returns a string.
           return reader.ReadToEnd();
       }
       public bool CanRead(System.Messaging.Message msg)
       {
           return true;
       }
       public object Clone()
       {
           return new MQFormat();
       }
   }
}

 

Solution fila: http://www.hiof.no/~vidarfle/stuff/wmqcs.rar

Message Queueing må være installert på maskinen, gjøres fra "Legg til/fjern Windows-komponenter"

 

En annen ting: ved kjøring opprettes køen, men siden programmet krasjer, så blir ikke køen fjernet, den må da slettes manuelt fra "Datamaskinbehandling->Tjenester og programmer->Message Queueing->Private køer" Køen heter "testq"

Ja, jeg vet jeg kunne fiksa det med en Exception greie, men har bare ikke giddi :p

 

 

Edit:

Etter massefeilsøking og googling, fant jeg det ut :w00t:

Klikk for å se/fjerne innholdet nedenfor
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace wmqcs
{
   public partial class Form1 : Form
   {
       string qpath = Environment.MachineName + @"\private$\testq";
       System.Messaging.Message msg;
       bool server = false;
       public Form1()
       {
           InitializeComponent();
           MQ = new System.Messaging.MessageQueue(qpath);
           MQ.Formatter = new System.Messaging.XmlMessageFormatter(new string[] {"System.String"});
           if (ChooseMode())
               GoServer();
           else
               GoClient();
       }
       private void GoServer()
       {
           msg = new System.Messaging.Message();
           msg.Formatter = new System.Messaging.XmlMessageFormatter(new string[] { "System.String" });
           MQ.BeginReceive();
       }
       private void GoClient()
       {
           MQ.Send(Environment.TickCount.ToString());
       }
       private bool ChooseMode()
       {
           if (!System.Messaging.MessageQueue.Exists(qpath))
           {
               System.Messaging.MessageQueue.Create(qpath, false);
               MQ.ReceiveCompleted += new System.Messaging.ReceiveCompletedEventHandler(MQ_ReceiveCompleted);                
               label1.Text = "Server";
               server = true;
               return true;
           }
           else
           {
               MQ.Path = qpath;
               label1.Text = "Client";
               return false;
           }
       }

       void MQ_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e)
       {
           msg = MQ.EndReceive(e.AsyncResult);
           string s = (string)msg.Body;
           MessageBox.Show(s);
           MQ.BeginReceive();
       }

       private void Form1_FormClosing(object sender, FormClosingEventArgs e)
       {
           if (server && System.Messaging.MessageQueue.Exists(qpath))
               System.Messaging.MessageQueue.Delete(qpath);
       }
   }
}

Endret av xtc

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...