队列框架方案之消息通知解决方案(二)

原创|其它|编辑:郝浩|2009-04-28 09:57:58.000|阅读 710 次

概述:在进行系统设计时,除了对安全、事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件系统,必须充分地考虑访问量、数据流量、服务器负荷的问题。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

3       接口设计

3.1    消息体MessageBase重构

3.1.1   重构过程

自定义消息体的好处很多,比如采用自己定义的格式相当于对数据进行了简单的加密,采用自己定义的格式可以节省通信的传递量等等。

因为我们的系统是为处理订单通知服务的,所以消息体的大概内容应该是订单的类型[订单生成、订单支付成功等],消息内容更确切的讲应为构造发送内容必须的参数[目前一个OrderId就够了]

其消息体的代码如下:

   [Serializable]

    public class MessageBase

    {

       /// <summary>

        /// 消息类型

        /// </summary>

        private string messagetype;

        public string MessageType

        {

            get { return messagetype; }

            set { messagetype = value; }

        }

        /// <summary>

        /// 消息内容

        /// </summary>

        private string messagebody;

        public string MessageBody

        {

            get { return messagebody; }

            set { messagebody = value; }

        }

    }

说明:1:消息体必须可序列化也就是有Serializable特性

      2:消息体尽量为轻量级内容

3.1.2   UML

 

3.2    客户端组件重构.

3.2.1   重构过程

这个和PetShop的消息发送、接收是一样滴,就不多说了。

 

3.2.2   UML

 

3.3    Section节点重构

3.3.1   重构过程

先看看app.config里的一段Section代码

 

上面的Section节点是该系统的纽带!没有它,系统将无法运行,发送器、处理器也成了独立的羔羊。既然很重要,那我们也就重点说说这个流程吧。

l         Notify继承 System.Configuration.ConfigurationSection它里面有ConnectionStringsClientMailsMessageTypesMessageProcessorsMessageSendersConfigurationProperty

l         ConnectionStrings继承ConfigurationElementCollection它保存了不同数据源的 connectionstring.

l         ClientMails继承 ConfigurationElementCollection, 它保存了常用的客服email

l         MessageSenders 是个ConfigurationElement , 里面配置Poster需要的信息。比如MailSender保存了Emaildomain,userid,pwd,from等相关信息。

l         MessageProcessor 是个ConfigurationElementCollection, 里面的每个ConfigurationElement保存了每个处理器和对应的Asssembly这样就可以通过下面的代码创建对应的处理器。

Type type = Type.GetType(processName);

Assembly a = Assembly.GetAssembly(type);

Object obj = a.CreateInstance(processName);

return obj as IProcessor;

l         MessageTypes 保存了每个消息类型[OrderCreate,OrderPaySucceed] 的个性特征。我们的系统就是通过MessageTypes里的每个MessageTypeProcessorMessageProcessor找对应的处理器的。

        1name:它就是消息体MessageBaseMessageType属性,当系统从msmq里取到消息后,就会根据nameMessageTypes找和MessageType匹配对应的条目

      2: processor 当从MessageTypes里找到对应的条目后,就会通过processorMessageProcessor去找对应的处理器。

      3Poster:它是对应了每个Messagetype[一个MessageType对应一个MessageProcessor]所需要的发送器Poster。多个Poster用逗号隔开。这样我们就可以配置发送器了。

      3Parameter:是增加的特性列表。其中Consumer,merchant,Client对应了买家、卖家、客服的内容模板,

guestEmail对应客户的email

3.3.2   UML

....

.

3.4    发送器Poster的重构

3.4.1   重构过程

商城的订单状态行为会产生通知,通知的方式目前有Email,sys,IM,他们三个有个共同的方法那就是Post投递方法,我们可以把Email,sys,IM当成三个Poster类,并且都有Post的方法。 代码如下:

public class EmailPoster

{

    public void Post(param1)

    {

        //TODO:Process order and Post

    }

}

public class IMPoster

{

    public void Post(param2)

    {

        //TODO:Process order and post

    }

}

public class syslogPoster

{

    public void Post(param3)

    {

        //TODO:Process order and post

    }

}

我们细看上面的代码,按照一般的重构常理应该提出一个基类或接口了。这里用接口更合适些,抽取出来的接口如下:

public interface ImsgPoster

{

        void post(SenderInfo sender);

    }

备注:SenderInfo是一个超类,用来保存要格式化内容时需要的参数

最后完整的代码如下:

public class EmailPoster : ImsgPoster

{

    public void Post(SenderInfo sender)

   {

        //TODO:Process order

    }

}

public class IMPoster : ImsgPoster

{

    public void Post(SenderInfo sender)

    {

        //TODO:Process order

    }

}

public class syslogPoster : ImsgPoster

{

    public void Post(SenderInfo sender)

    {

        //TODO:Process order

    }

}

 public interface ImsgPoster

    {

        void Post(SenderInfo sender);

    }

 

public class SenderInfo

{}

3.4.2   UML


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP