MessageClient

using Manager.Common;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace ExchangeManager.WCF
{
    public class MessageClient
    {
        private RelayEngine<MessageCollection> _MessageRelayEngine;
        private MessageReceiver _MessageReceiver;
        private Stopwatch stopwatch = new Stopwatch();

        public MessageClient()
        {
            this._MessageRelayEngine = new RelayEngine<MessageCollection>(this.ProcessMessage, this.HandleException);
            this._MessageRelayEngine.Suspend();
            this._MessageReceiver = new MessageReceiver(this._MessageRelayEngine);
        }
        public void StartMessageProcess(string hostName, int messageDispatchListenPort, string sessionId)
        {
            this._MessageReceiver.Start(hostName, messageDispatchListenPort, sessionId);
            this._MessageRelayEngine.Resume();
        }
        public void SendMessage(byte[] data)
        {
            try
            {
                this._MessageRelayEngine.AddItem(CompressHelper.FromByteArray<MessageCollection>(data));
                ConsoleClient.Instance.RefreshLastMsgTime();
            }
            catch (Exception ex) { }
        }

        public void Stop()
        {
            this._MessageReceiver.Stop();
            this._MessageRelayEngine.Suspend();
        }

        //接受服务端消息
        private bool ProcessMessage(MessageCollection message)
        {
            try
            {
                App.MainFrameWindow.Dispatcher.BeginInvoke((Action)delegate()
                {
                    try
                    {
                        stopwatch.Restart();
                        this.Process(message);
                        stopwatch.Stop();
                        //MessageStatistics.Instance.AddItem(message.GetType().Name, stopwatch.ElapsedMilliseconds);
                        if (stopwatch.ElapsedMilliseconds > 50)
                        {
                            //Logger.TraceEvent(TraceEventType.Error, "MessageClient Dispatcher Message type:{0}\r\n{1}", message.GetType().Name, stopwatch.ElapsedMilliseconds);
                        }
                    }
                    catch (Exception exception)
                    {
                        //Logger.TraceEvent(TraceEventType.Error, "MessageClient Dispatcher Message type:{0}\r\n{1}", message.GetType().Name, exception);
                    }
                });
            }
            catch (Exception exception) { }
            return true;
        }

        private void Process(MessageCollection messages)
        {
            foreach (Message item in messages.Messages)
            {
                this.Process((dynamic)item);
            }
        }

        private void Process(PriceMessage message)
        {
            try
            {
                //处理消息
                App.MainFrameWindow.PriceLable.Content = message.Price;
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
            }
        }

        private void HandleException(Exception exception)
        {
        }
    }
}
时间: 2024-08-09 21:58:37

MessageClient的相关文章

如何站在使用者的角度来设计SDK-微信公众号开发SDK(消息处理)设计之抛砖引玉

0.SDK之必备的基本素质 在项目中免不了要用到各种各样的第三方的sdk,在我现在的工作中就在公司内部积累了各种各样的的公共库(基于.net的,基于silverlight的等等),托管到了内部的nuget私服上,大大的方便了项目的开发. 在积累这些库的过程中走过不少弯路,今天分享给大家(借助微信公众平台开发的消息处理模块的SDK(一下简称微信消息sdk)做个设计思路剖析)笔者的一些思路的,私以为一个sdk需要具备如下的3条基本素质. 站在使用者的角度考虑设计! 易维护( 对修改关闭,对扩展开放

ActiveMQ安装与使用

一 .安装运行ActiveMQ: 1.下载activemq wget http://archive.apache.org/dist/activemq/apache-activemq/5.9.0/apache-activemq-5.9.0-bin.tar.gz 2.解压 tar -xf apache-activemq-5.9.0-bin.tar.gz [[email protected] ~]$ cd apache-activemq-5.9.0 [[email protected] apache-

在线教学、视频会议 Webus Fox(3) 客户端开发手册

本文主要介绍webus fox 客户端的配置及接口说明. 1. 文件列表和配置 1.1 文件列表 1.2 common.xml 配置 根据服务器端的部署, 替换[ServerUrl] , [RtmpPort], [GatewayPort] [GatewayPort]: 指的是iis 里的site的port 2. 相关接口说明 2.1. 消息 2.1.1 MessageClient/MsgClient.as API名称 start 应用场景 启动message消息, 连接服务并登陆 异常   AP

微观SOA:服务设计原则及其实践方式

大 量互联网公司都在拥抱SOA和服务化,但业界对SOA的很多讨论都比较偏向高大上.本文试图从稍微不同的角度,以相对接地气的方式来讨论SOA, 集中讨论SOA在微观实践层面中的缘起.本质和具体操作方式,另外也用相当篇幅介绍了当今互联网行业中各种流行的远程调用技术等等,比较适合从事实际工作 的架构师和程序员来阅读. 为了方便阅读,本话题将分为两篇展现.本文是上篇,着眼于微观SOA的定义,并简单分析其核心原则. 亚马逊CEO杰夫•贝佐斯:鲜为人知的SOA大师 由于SOA有相当的难度和门槛,不妨先从一个

Android 基于Netty的消息推送方案之字符串的接收和发送(三)

在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> ,我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffer的东东. ChannelBuffer Netty中的消息传递,都必须以字节的形式,以ChannelBuffer为载体传递.简单的说,就是你想直接写个字符串过去,对不起,抛异常.虽然,Netty定义的writer的接口参数是Object的,这可能也是会给新上手的朋友容易造成误会的地方.Netty源码中,是这样

Java Swing客户端小项目

记录一下两个用java swing写的客户端. 项目1: 关键词:swing  jtable 代码如下: 1.主类: package com.my.agent.client; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java

Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger

Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- AIDL了解如何使用Aidl的方式实现服务端与客户端的通信. 在Service中使用Messenger,大部分代码还是跟Android的消息机制打交道,具体一点就是跟Handler,Mes

验证码的获取与验证

一.验证码的获取(将相关内容存在session中): public class SendValidMsg extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 如果不存在 session 会话,则创建一个 session 对象 HttpSession session = req.g

[转]微观SOA:服务设计原则及其实践方式

转了收藏,以后再看... 出处 上:http://kb.cnblogs.com/page/505537/ 下:http://kb.cnblogs.com/page/505538/ 大量互联网公司都在拥抱SOA和服务化,但业界对SOA的很多讨论都比较偏向高大上.本文试图从稍微不同的角度,以相对接地气的方式来讨论SOA,集中讨论SOA在微观实践层面中的缘起.本质和具体操作方式,另外也用相当篇幅介绍了当今互联网行业中各种流行的远程调用技术等等,比较适合从事实际工作的架构师和程序员来阅读. 为了方便阅读