using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BPASmartClient.MessageCommunication.MsgControl
{
///
/// 内部消息总线
///
public class InnerMessageBus
{
static InnerMessageBus _bus;
const int TimeOut = 2000;
static public InnerMessageBus Get_Instance()
{
if (_bus == null)
{
_bus = new InnerMessageBus();
}
return _bus;
}
#region 委托事件的定义
///
/// 当触发引用事件时执行的委托
///
public delegate void MessageEventHandler(object sender,InnerMessageEventArgs e);
#endregion
#region 自定义各类响应事件
///
/// 返回为整数型的结果事件响应
///
public event MessageEventHandler M_Event_消息事件;
#endregion
private readonly Object thisLock = new Object();
///
/// 发送消息方法
/// ----------------------------------------------
///
/// 消息发送者
/// 消息名称串
/// 消息体数据区
public void PostMessage(object sender,string str_Msg,object obj_Data)
{
bool isLock = false;
System.Threading.Monitor.TryEnter(thisLock,TimeOut,ref isLock);
if (!isLock)//理论上不可能出现
{
return;
}
try
{
var temp = RouteTable.ToList();
foreach (ListenPointInfo item in temp)
{
if (MachMessageName(str_Msg,item))
{
InnerMessageEventArgs temp_arg = new InnerMessageEventArgs();
temp_arg.obj_Sender = sender;
temp_arg.obj_MessageObj = obj_Data;
temp_arg.str_MessageStr = str_Msg;
TypeHelper helper = new TypeHelper();
object[] args = new object[2];
args[0] = sender;
args[1] = temp_arg;
if (sender != null)
{
try
{
helper.M_Call_InstancMethod(item.PointObj,item.MethodName,args);
}
catch (Exception exp)
{
}
}
}
}
}
catch (Exception exp)
{
//接收消息的调用方法发生异常
}
finally
{
System.Threading.Monitor.Exit(thisLock);
}
}
///
/// 采用正则表达式匹配字符串
///
///
///
///
private static bool MachMessageName(string MessageString,ListenPointInfo item)
{
string value;
string pattern;
value = MessageString;
try
{
pattern = item.str_Message.Replace("*",@"[-\.\w]*");
///使用正则表达式进行消息路由匹配;
if (pattern.Contains('*'))
{
if (Regex.IsMatch(value,pattern))
{
//Console.WriteLine("路由消息" + MessageString + " * " + (((item.PointObj.GetType()).FullName + "匹配成功!")));
return true;
}
else
{
return false;
}
}
else
{
if (value == pattern)
{
//Console.WriteLine("路由消息" + MessageString + "匹配成功!");
return true;
}
else
{
return false;
}
}
}
catch (Exception ex)
{
Console.WriteLine("InnerMessageBus类MachMessageName方法出错,原因:" + ex.Message);
return false;
}
}
///
/// 消息路由表,内部的
///
List RouteTable = new List();
///
/// 外部应用调用消息
///
/// 消息监听对象者
///
///
public void ListenMessage(object obj_Listener,string str_MessageString,string str_处理方法名称)
{
// arg = new InnerMessageEventArgs();
Type[] argTypes = new Type[2];
argTypes[0] = typeof(object);
argTypes[1] = typeof(InnerMessageEventArgs);
if (obj_Listener.GetType().GetMethod(str_处理方法名称,argTypes) != null)
{
ListenPointInfo info = new ListenPointInfo();
info.PointObj = obj_Listener;
info.str_Message = str_MessageString;
info.MethodName = str_处理方法名称;
bool isLock = false;
System.Threading.Monitor.TryEnter(thisLock,TimeOut,ref isLock);
if (!isLock)//理论上不可能出现
{
return;
}
try
{
RouteTable.Add(info);
}
finally
{
System.Threading.Monitor.Exit(thisLock);
}
}
else
{
TypeHelper helper = new TypeHelper();
if ((helper.M_GetMethodInfosByName(obj_Listener.GetType(),str_处理方法名称).Count != 1))
{
//taoye modified
Console.WriteLine("在使用消息中间件时,希望执行ListenMessage方法,绑定" + obj_Listener.GetType().ToString() + "中方法:" + str_处理方法名称 + ",但该方法不唯一或不存在.");
}
}
}
///
/// 关闭消息监听和事件的挂接关系
///
/// 消息名称
/// 消息处理方法名称
public void ListenMessage_trunOff(string str,string str_消息处理方法名称)
{
bool isLock = false;
System.Threading.Monitor.TryEnter(thisLock,TimeOut,ref isLock);
if (!isLock)//理论上不可能出现
{
return;
}
try
{
for (int i = RouteTable.Count - 1; i >= 0; i--)
{
if (str == RouteTable[i].str_Message && str_消息处理方法名称 == RouteTable[i].MethodName)
{
RouteTable.RemoveAt(i);
break;
}
}
}
finally
{
System.Threading.Monitor.Exit(thisLock);
}
}
///
/// 采用对象方式直接释放指定对象的监听信息
///
///
///
private bool RemoveRouteTableByObject(object obj)
{
bool isLock = false;
System.Threading.Monitor.TryEnter(thisLock,TimeOut,ref isLock);
if (!isLock)//理论上不可能出现
{
return false;
}
bool result = false;
int currentI = -1;
try
{
for (int i = 0; i < this.RouteTable.Count; i++)
{
if (RouteTable[i].PointObj == obj)
{
currentI = i;
}
}
if (currentI != -1)
{
RouteTable.RemoveAt(currentI);
result = true;
}
}
finally
{
System.Threading.Monitor.Exit(thisLock);
}
return result;
}
///
/// 调试用属性,获取当前路由表所有的信息,只读
///
public List __Debug_RoutTable
{
get
{
return this.RouteTable;
}
}
}
}