一、MSMQ(微软的消息队列)
using System;
using System.Collections.Generic;
using System.Text;
using System.Messaging;
using System.Transactions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MessageQueue mq = new MessageQueue();
//判断队列是否存在
if (MessageQueue.Exists(@".\Private$\test"))
MessageQueue.Delete(@".\Private$\test");
//删除队列
MessageQueue.Create(@".\Private$\test");
//创建队列
mq.Path = @".\Private$\test";
#region 路径中使用的语法
//公共队列
//MachineName\QueueName
//专用队列
//MachineName\Private$\QueueName
//日志队列
//MachineName\QueueName\Journal$
//示例:
// mq.Path = @"sf00902395d34\Private$\test"; //sf00902395d34是主机名
// mq.Path = @"FormatName:DIRECT=OS:sf00902395d34\Private$\test";
// mq.Path = @"FormatName:DIRECT=OS:localhost\Private$\test";
// 访问远程电脑上的消息队列时Path的格式
// mq.Path = @"FormatName:DIRECT=OS:server\Private$\test";
#endregion
//构造消息
Message msg = new Message();
msg.Body = "HelloWorld:" + DateTime.Now.ToString();
msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
//消息格式化
//向队列发送消息
mq.Send(msg, "001");
mq.Send(msg, "002");
mq.Send(msg, "003");
mq.Send(msg, "004");
//读取队列中的所有消息
Message[] msgs = mq.GetAllMessages();
foreach (Message m in msgs)
{
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
{
try
{
Message mRec = mq.Receive();
//接受消息
//Message mRec = mq.ReceiveById("1");
//接受消息
//Message mRec = mq.Peek();
//查看
//Message mRec = mq.PeekById("002");
//查看
mRec.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
Console.WriteLine(mRec.Body);
ts.Complete();
}
catch
{
}
}
}
//清除队列中的所有消息
//mq.Purge();
Console.Read();
}
}
}
问题解决:
一、此计算机上尚未安装消息队列
控制面板里,选择添加删除,添加删除windows组件,选择服务里的Msmq(Microsoft Message Queue)
二、队列不存在,或您没有足够的权限执行该操作。
打开Computer Management – Message Queuing,在Private Queues下创建MSMQDemo队列
也可以用代码解决
if (!MessageQueue.Exists(".""Private$""MSMQDemo"))
{
MessageQueue.Create(".""Private$""MSMQDemo");
}
二、
IBM WebSphere MQ
//新建本地队列
PCFMessageAgent agent = new PCFMessageAgent("QM_janus");
//QM_janus队列管理器名称
PCFMessage request = new PCFMessage(CMQCFC.MQCMD_CREATE_Q);
request.AddParameter(MQC.MQCA_Q_NAME, "test_queue");
//test_queue队列名称
request.AddParameter(MQC.MQIA_Q_TYPE, MQC.MQQT_LOCAL);
//request.AddParameter(MQC.MQIA_USAGE, MQC.MQUS_TRANSMISSION);
PCFMessage[] response = agent.Send(request);
//删除队列
PCFMessageAgent agent = new PCFMessageAgent("QM_janus");
PCFMessage request = new PCFMessage(CMQCFC.MQCMD_DELETE_Q);
request.AddParameter(MQC.MQCA_Q_NAME, "test_queue");
PCFMessage[] response = agent.Send(request);
//向队列写消息
MQQueueManager qMgr = new MQQueueManager("test");
MQQueue queue = qMgr.AccessQueue("test_queue", MQC.MQOO_OUTPUT);
MQMessage message = new MQMessage();
message.WriteString("message body");
queue.Put(message);
//向队列读消息
MQQueueManager qMgr = new MQQueueManager("test");
MQQueue queue = qMgr.AccessQueue("test_queue", MQC.MQOO_INPUT_AS_Q_DEF);
MQMessage message = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.Options = MQC.MQGMO_WAIT;
gmo.WaitInterval = 1000;
gmo.MatchOptions = MQC.MQMO_NONE;
queue.Get(message);
MessageBox.Show(message.ReadString(100));
//向队列写消息
MQQueueManager qMgr = new MQQueueManager("QM_janus");
MQQueue queue = qMgr.AccessQueue("postcard", MQC.MQOO_OUTPUT);
MQMessage message = new MQMessage();
message.WriteString("message body");
queue.Put(message);
//枚举所有队列
PCFMessageAgent agent = new PCFMessageAgent("QM_janus");
PCFMessage request = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_NAMES);
request.AddParameter(MQC.MQCA_Q_NAME, "*");
PCFMessage[] response = agent.Send(request);
string[] names = response[0].GetStringListParameterValue(CMQCFC.MQCACF_Q_NAMES);