您的位置:首页 > 其它

消息队列初体验

2015-10-25 19:42 155 查看
一、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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: