网上关于消息队列技术原理说明的详细文档很多,但涉及到Delphi的具体实现很少,这是我从网上找了一上午的资料,自己整合和尝试的能运行的程序。
打开控制面板->程序->添加组件,添加消息队列
打开控制面板->计算机管理->服务与应用程序->消息队列,添加私有有消息Test.
在Delphi中添加MSMQ控件, TMSMQMessage; TMSMQQueueInfo; TMSMQQueue; TMSMQEvent; 这些控件在Project->Import type Library里存在。
源代码如下:
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs,MSMQ_TLB,ComObj, StdCtrls, OleServer;
- type
- TForm1 = class(TForm)
- MSMQMessage1: TMSMQMessage;
- MSMQQueueInfo1: TMSMQQueueInfo;
- MSMQQueue1: TMSMQQueue;
- MSMQEvent1: TMSMQEvent;
- Button1: TButton;
- edit1: TEdit;
- edit2: TEdit;
- Button2: TButton;
- lbl1: TLabel;
- lbl2: TLabel;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- procedure MSMQEvent1Arrived(Sender: TObject; var Queue: OleVariant;
- Cursor: Integer);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- //发送消息
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- //确定消息队列路径
- MSMQQueueInfo1.PathName :='./Private$/Test';
- //远程机器名
- MSMQQueueInfo1.RemoteMachineName := '127.0.0.1' ;
- //消息内容
- (MSMQMessage1.DefaultInterface as IMSMQMessage).body :=edit1.Text;
- //连接到消息队列
- MSMQQueue1.ConnectTo(MSMQQueueInfo1.Open(MQ_SEND_ACCESS, 0));
- //发送消息
- MSMQMessage1.Send(MSMQQueueInfo1.Open(MQ_SEND_ACCESS, MQ_DENY_NONE));
- showmessage( '已经把信息入写入消息队列中 ');
- end;
- //接收消息
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- msmqqueueinfo1.PathName :='./Private$/Test';
- msmqqueue1.Disconnect;
- msmqqueue1.ConnectTo(msmqqueueinfo1.Open(1, 0));
- //
- msmqqueue1.EnableNotification(MSMQEvent1.DefaultInterface);
- end;
- //MSMQEvent事件
- procedure TForm1.MSMQEvent1Arrived(Sender: TObject; var Queue: OleVariant;
- Cursor: Integer);
- var
- Msg: Variant;
- begin
- //从队列中读取消息
- Msg := msmqqueue1.Receive;
- edit2.Text := Msg.body;
- end;
- end.
可以连续发送多条不同的消息。消息会添加到消息队列。每“接收”一次会从消息队列中获取一条消息并显示在接受消息框中。