消息队列初体验

一、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);
1. Android中四大组件分别是什么?它们的作用是什么? 答:四大组件分别是Activity、Service、Broadcast Receiver、Content Provider。它们的作用分别是: - Activity:用户界面的展示和交互。 - Service:后台运行的组件,没有用户界面。 - Broadcast Receiver:接收系统或应用发出的广播消息。 - Content Provider:数据共享组件,用于不同应用之间的数据交互。 2. 说一说Intent的作用? 答:Intent是Android中用于传递消息的一种机制,可以在应用内或应用间传递消息。Intent可以启动Activity、Service和Broadcast Receiver,并且也可以传递数据给这些组件。 3. 什么是ANR?如何避免ANR? 答:ANR即应用程序无响应(Application Not Responding),通常是由于主线程被阻塞导致的。为了避免ANR,需要注意以下几点: - 不要在主线程中进行耗时操作,例如网络请求和大量的计算。 - 避免在主线程中进行阻塞IO操作。 - 尽可能使用异步任务和线程池。 - 将耗时操作放入Service或者IntentService中处理。 4. 什么是Fragment?Fragment和Activity有什么区别? 答:Fragment是一种可以嵌入到Activity中的组件,可以在一个Activity中展示多个Fragment,也可以在多个Activity中复用同一个Fragment。Fragment可以看作是Activity中的一个子模块,具有自己的生命周期和用户界面。 区别: - Fragment需要依附于Activity才能使用,而Activity是独立的。 - Fragment可以被多个Activity复用,Activity只能使用一次。 - Fragment有自己的生命周期,Activity有自己的生命周期。 5. 什么是Handler?如何使用Handler? 答:Handler是Android中的消息机制,用于异步处理消息和更新UI。通过Handler可以将消息发送到主线程的消息队列中,然后在主线程中处理这些消息。 使用Handler的步骤: - 创建一个Handler对象,通常在主线程中创建,因为Handler会绑定主线程的消息队列。 - 在后台线程中发送消息到Handler中。 - 在主线程中处理消息。 6. 什么是RecyclerView?它和ListView的区别是什么? 答:RecyclerView是一种高度可定制化的列表控件,可以展示大量的数据,并且支持滚动和快速滑动。它和ListView的主要区别是: - RecyclerView的布局可以自由定制,可以实现瀑布流等效果。 - RecyclerView的ViewHolder可以复用,可以大大提高列表的效率。 - RecyclerView支持动画效果,可以实现更加流畅的用户体验。 7. 如何实现数据的持久化? 答:Android中有多种方式可以实现数据的持久化,包括: - Shared Preferences:用于存储少量的简单数据,例如应用的配置信息。 - 文件存储:可以通过FileOutputStream和FileInputStream将数据以文件的形式存储到本地。 - SQLite数据库:用于存储大量的结构化数据,例如应用的用户信息和日志等。 - Content Provider:用于不同应用之间的数据共享。 8. 什么是Service?它和Thread的区别是什么? 答:Service是Android中的一种后台运行的组件,用于处理一些长时间运行的任务。它和Thread的主要区别是: - Service是Android中的一种组件,可以和其他组件进行交互,而Thread是Java中的一种线程,不能直接和其他组件进行交互。 - Service可以在后台运行,即使应用被关闭也可以继续运行,而Thread需要在应用中运行。 - Service可以通过Intent启动和停止,而Thread需要手动创建和销毁。 9. Android中常用的布局有哪些? 答:Android中常用的布局有: - LinearLayout:线性布局,可以将子控件排列成水平或垂直方向。 - RelativeLayout:相对布局,可以根据控件之间的相对位置进行排列。 - FrameLayout:帧布局,可以将子控件叠加在一起。 - ConstraintLayout:约束布局,可以通过设置控件之间的约束关系进行排列。 10. 如何实现Activity之间的数据传递? 答:可以通过Intent来实现Activity之间的数据传递。Intent可以通过putExtra()方法将数据放入Intent中,然后在目标Activity中通过getExtra()方法获取数据。例如: ```java // 在源Activity中传递数据 Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("key", "value"); startActivity(intent); // 在目标Activity中获取数据 String value = getIntent().getStringExtra("key"); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值