一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种跨平台的异步消息处理方法、装置、设备、存储介质与流程

2022-06-01 00:44:32 来源:中国专利 TAG:


1.本发明涉及异步任务处理技术领域,具体涉及一种跨平台的异步消息处理方法、装置、设备、存储介质。


背景技术:

2.目前常用的异步任务实现方案中,有如下几种:
3.一种是给每个任务都建立一个线程来处理,这样其他的任务可以在主线程中继续运行,在消息处理线程中,等待消息的响应。这种方案的优点是实现简单,缺点是每个任务都需要单独启用一个线程,在任务特别多的时候对系统资源消耗较大。
4.另外一种实现方案是将每一个事件生成一个设备描述符,然后通过系统的io多路复用技术,将设备描述符加入到系统监听中,实现响应消息的通知。这种方案的优点是单线程可以管理多路事件,缺点是实现复杂,不同的系统实现需要进行适配。


技术实现要素:

5.为了解决异步任务实现中系统资源消耗高、实现复杂,跨平台间开发难度大,本发明提供了接口简单、实现高效的跨平台异步任务实现方案,具体本发明提供一种跨平台的异步消息处理方法、装置、设备、存储介质。
6.本发明的技术方案是:
7.第一方面,本发明技术方案提供一种跨平台的异步消息处理方法,包括如下步骤:
8.消息发送时,将消息和其超时处理函数注册到时间轮定时器中,同时将消息加入到红黑树中,设置引用计数增加;
9.接收响应消息,判断该消息的超时处理函数是否被调用;
10.若否,查询红黑树判别该消息是否存在;
11.若存在,获取红黑树中的具体对象作响应处理;
12.若不存在,丢弃该响应消息,引用计数减少;
13.若是,判断该响应超时,将该消息从红黑树中删除,同时将该消息从定时任务去去除;引用计数减少,当引用计数值为零时,销毁对象。
14.进一步的,消息发送时,将消息和其超时处理函数注册到时间轮定时器中,同时将消息加入到红黑树中,设置引用计数增加的步骤包括:
15.当需要发送消息时,构建一个消息对象;消息对象包括全局唯一的和进程有关的消息id,引用计数以及消息本身包含的信息,其中,引用计数用来管理对象的生命周期;
16.消息对象生成后,将消息id作为key值、对象本身作为value加入到红黑树中,同时引用计数加一;
17.将该消息注册到时间轮定时器中,同时注册定时任务超时处理函数,引用计数加一。
18.进一步的,查询红黑树判别该消息是否存在的步骤包括:
19.接收并解析响应消息;
20.获取该响应消息对应的消息id;
21.将此消息id作为key值在红黑树中进行查找,判断该消息id在红黑树中是否存在。
22.进一步的,获取红黑树中的具体对象作响应处理的步骤包括:
23.获取红黑树中作为value的具体对象,进行消息响应处理;
24.消息处理完毕后则将其从时间轮定时器里删除,当引用计数不为零时,引用计数减一,同时从红黑树里删除,当引用计数不为零时,引用计数减一;当引用计数为零时,销毁该对象。
25.进一步的,判断该响应超时,将该消息从红黑树中删除,同时将该消息从定时任务去去除;引用计数减少,当引用计数值为零时,销毁对象的步骤包括:
26.判断该响应超时,将该消息从红黑树中删除,当引用计数不为零时,引用计数减一,将该消息从定时任务去去除,当引用计数不为零时,引用计数减一,当引用计数为零时,销毁该对象。
27.第二方面,本发明技术方案提供一种跨平台的异步消息处理装置,包括发送设置处理模块、接收设置处理模块;
28.发送设置处理模块,用于消息发送时,将消息和其超时处理函数注册到时间轮定时器中,同时将消息加入到红黑树中,设置引用计数增加;
29.接收设置处理模块包括接收判断单元、查询单元、响应处理单元、设置处理单元;
30.接收判断单元,用于接收响应消息,判断该消息的超时处理函数是否被调用;
31.查询单元,用于查询红黑树判别该消息是否存在;
32.响应处理单元,用于获取红黑树中的具体对象作响应处理;
33.设置处理单元,用于若红黑树中不存在该响应的消息,丢弃该响应消息,设置引用计数减少;若响应超时,将该消息从红黑树中删除,同时将该消息从定时任务去去除;引用计数减少,当引用计数值为零时,销毁对象。
34.进一步的,发送设置处理模块包括构建单元、插入设置单元、注册设置单元;
35.构建单元,用于当需要发送消息时,构建一个消息对象;消息对象包括全局唯一的和进程有关的消息id,引用计数以及消息本身包含的信息,其中,引用计数用来管理对象的生命周期;
36.插入设置单元,用于消息对象生成后,将消息id作为key值、对象本身作为value加入到红黑树中,同时引用计数加一;
37.注册设置单元,用于将该消息注册到时间轮定时器中,同时注册定时任务超时处理函数,引用计数加一。
38.进一步的,接收设置处理模块还包括解析单元、获取单元;
39.解析单元,用于接收并解析响应消息;
40.获取单元,用于获取该响应消息对应的消息id;
41.查询单元,具体用于将此消息id作为key值在红黑树中进行查找,判断该消息id在红黑树中是否存在。
42.进一步的,响应处理单元包括响应子模块和和处理子模块;
43.响应子模块,具体用于获取红黑树中作为value的具体对象,进行消息响应处理;
44.处理子模块,用于消息处理完毕后则将其从时间轮定时器里删除,当引用计数不为零时,引用计数减一,同时从红黑树里删除,当引用计数不为零时,引用计数减一;当引用计数为零时,销毁该对象。
45.进一步的,设置处理单元,具体用于判断该响应超时,将该消息从红黑树中删除,当引用计数不为零时,引用计数减一,将该消息从定时任务去去除,当引用计数不为零时,引用计数减一,当引用计数为零时,销毁该对象。
46.第三方面,本发明技术方案提供一种计算机设备,包括处理器和存储器,所述处理器和所述存储器通过总线完成相互间的通信;所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如第一方面所述的跨平台的异步消息处理方法。
47.第四方面,本发明一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行如第一方面所述的跨平台的异步消息处理方法。
48.从以上技术方案可以看出,本发明具有以下优点:解决用相对少的系统消耗、相对简明的接口实现一种跨平台的异步消息解决方案,其中使用的时间轮定时器,这是一种高效的和平台无关的定时器,具体接口简单、消耗资源较小的特点。本发明中用来存储消息对象的是红黑树,与通常用的链表相比,具体更高的效率,同时本发明中的方案接口简单、便于快速移植在已有系统中。
49.1.管理消息是否是本机发送出去的,用到了红黑树,红黑树的优点时插入对象、删除对象时,维持树的平衡只需要3次旋转,在这种随机性较大的场景下和其他数据结构相比综合性能更好。
50.2.定时器采用的是时间轮实现,这是一种高效的定时器实现方法,可以跨平台使用。
51.3.通过引入引用计数来管理对象,保证对象可以正确的被释放。
52.4.封装实现的接口简单、便于集成实现。
53.此外,本发明设计原理可靠,结构简单,具有非常广泛的应用前景。
54.由此可见,本发明与现有技术相比,具有突出的实质性特点和显著地进步,其实施的有益效果也是显而易见的。
附图说明
55.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
56.图1是本发明一个实施例的方法的示意性流程图。
57.图2是本发明一个实施例的装置的示意性框图。
具体实施方式
58.目前常用的异步任务实现方案中,有如下几种:一种是给每个任务都建立一个线程来处理,这样其他的任务可以在主线程中继续运行,在消息处理线程中,等待消息的响
应。这种方案的优点是实现简单,缺点是每个任务都需要单独启用一个线程,在任务特别多的时候对系统资源消耗较大。另外一种实现方案是将每一个事件生成一个设备描述符,然后通过系统的io多路复用技术,将设备描述符加入到系统监听中,实现响应消息的通知。这种方案的优点是单线程可以管理多路事件,缺点是实现复杂,不同的系统实现需要进行适配。为了解决异步任务实现中系统资源消耗高、实现复杂,跨平台间开发难度大,本发明提供了接口简单、实现高效的跨平台异步任务实现方案,具体本发明提供一种跨平台的异步消息处理方法、装置、设备、存储介质。
59.为了使本技术领域的人员更好地理解本发明中的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
60.如图1所示,本发明实施例提供一种跨平台的异步消息处理方法,包括如下步骤:
61.步骤1:消息发送时,将消息和其超时处理函数注册到时间轮定时器中,同时将消息加入到红黑树中,设置引用计数增加;
62.需要说明的是,红黑树的每个节点上都有存储位表示节点的颜色,可以是红(red)或黑(black)。红黑树的特性:(1)每个节点或者是黑色,或者是红色。(2)根节点是黑色。(3)每个叶子节点(nil)是黑色。这里叶子节点,是指为空(nil或null)的叶子节点。(4)如果一个节点是红色的,则它的子节点必须是黑色的。(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。将消息加入红黑树中的步骤一般包括:第一步:将红黑树当作一颗二叉查找树,将节点插入。第二步:将插入的节点着色为"红色"。第三步:通过一系列的旋转或着色等操作,使之重新成为一颗红黑树。
63.步骤2:接收响应消息,判断该消息的超时处理函数是否被调用;若否,执行步骤3,若是,执行步骤6;
64.步骤3:查询红黑树判别该消息是否存在;若存在,执行步骤4,若不存在,执行步骤5;
65.步骤4:获取红黑树中的具体对象作响应处理;
66.步骤5:丢弃该响应消息,引用计数减少;
67.步骤6:判断该响应超时,将该消息从红黑树中删除,同时将该消息从定时任务去去除;引用计数减少,当引用计数值为零时,销毁对象。
68.在有些实施例中,步骤1中消息发送时,将消息和其超时处理函数注册到时间轮定时器中,同时将消息加入到红黑树中,设置引用计数增加的步骤包括:
69.步骤11:当需要发送消息时,构建一个消息对象;消息对象包括全局唯一的和进程有关的消息id,引用计数以及消息本身包含的信息,其中,引用计数用来管理对象的生命周期;
70.步骤12:消息对象生成后,将消息id作为key值、对象本身作为value加入到红黑树中,同时引用计数加一;
71.需要说明的是,根据被插入节点的父节点的情况,可以将当节点z被着色为红色节点,并插入二叉树划分为三种情况来处理。
72.①
被插入的节点是根节点。
73.处理方法:直接把此节点涂为黑色。
74.②
被插入的节点的父节点是黑色。
75.处理方法:节点被插入后,仍然是红黑树。
76.③
被插入的节点的父节点是红色。
77.处理方法:该情况与红黑树的特性(5)相冲突。这种情况下,被插入节点是一定存在非空祖父节点的;进一步的讲,被插入节点也一定存在叔叔节点(即使叔叔节点为空,我们也视之为存在,空节点本身就是黑色节点)。理解这点之后,我们依据叔叔节点的情况,将这种情况进一步划分为3种情况(case)。
78.(1)当前节点的父节点是红色,且当前节点的祖父节点的另一个子节点(叔叔节点)也是红色。
79.(01)将父节点设为黑色。
80.(02)将叔叔节点设为黑色。
81.(03)将祖父节点设为红色。
82.(04)将祖父节点设为当前节点(红色节点);即,之后继续对当前节点进行操作。
83.(2)当前节点的父节点是红色,叔叔节点是黑色,且当前节点是其父节点的右孩子。
84.(01)将父节点作为新的当前节点。
85.(02)以新的当前节点为支点进行左旋。
86.(3)当前节点的父节点是红色,叔叔节点是黑色,且当前节点是其父节点的左孩子。
87.(01)将父节点设为黑色。
88.(02)将祖父节点设为红色。
89.(03)以祖父节点为支点进行右旋。
90.上述处理问题的核心思路都是:将红色的节点移到根节点;然后,将根节点设为黑色。
91.步骤13:将该消息注册到时间轮定时器中,同时注册定时任务超时处理函数,引用计数加一。
92.引用计数这种计数是为了防止内存泄露而产生的。基本想法是对于动态分配的对象,进行引用计数,每当增加一次对同一个对象的引用,那么引用对象的引用计数就会增加一次,每删除一次引用,引用计数就会减一,当一个对象的引用计数减为零时,就自动删除指向的堆内存。引用计数不是垃圾回收,引用技术能够尽快收回不再被使用的对象,同时在回收的过程中也不会造成长时间的等待,更能够清晰明确的表明资源的生命周期。
93.在有些实施例中,步骤3中查询红黑树判别该消息是否存在的步骤包括:
94.步骤31:接收并解析响应消息;
95.步骤32:获取该响应消息对应的消息id;
96.步骤33:将此消息id作为key值在红黑树中进行查找,判断该消息id在红黑树中是否存在。
97.在有些实施例中,步骤4中获取红黑树中的具体对象作响应处理的步骤包括:
98.步骤41:获取红黑树中作为value的具体对象,进行消息响应处理;
99.步骤42:消息处理完毕后则将其从时间轮定时器里删除,当引用计数不为零时,引用计数减一,同时从红黑树里删除,当引用计数不为零时,引用计数减一;当引用计数为零时,销毁该对象。
100.需要说明的是,将红黑树内的某一个节点删除。需要执行的操作依次是:首先,将红黑树当作一颗二叉查找树,将该节点从二叉查找树中删除;然后,通过旋转和重新着色等一系列来修正该树,使之重新成为一棵红黑树。详细描述如下:
101.第一步:将红黑树当作一颗二叉查找树,将节点删除。
102.这和删除常规二叉查找树中删除节点的方法是一样的,分3种情况:
103.(1)被删除节点没有子节点,即为叶节点。那么,直接将该节点删除就ok了。
104.(2)被删除节点只有一个子节点。那么,直接删除该节点,并用该节点的唯一子节点顶替它的位置。
105.(3)被删除节点有两个子节点。那么,先找出它的后继节点;然后把它的后继节点的内容复制给该节点的内容;之后,删除它的后继节点。在这里,后继节点相当于替身,在将后继节点的内容复制给被删除节点之后,再将后继节点删除。这样就将问题转换为删除后继节点的情况了。在被删除节点有两个非空子节点的情况下,它的后继节点不可能是双子非空。既然后继节点不可能双子都非空,就意味着该节点的后继节点要么没有子节点,要么只有一个子节点。若没有子节点,则按情况(1)进行处理;若只有一个子节点,则按情况(2)进行处理。
106.第二步:通过旋转和重新着色等一系列来修正该树,使之重新成为一棵红黑树。因为第一步中删除节点之后,可能会违背红黑树的特性。所以需要通过旋转和重新着色来修正该树,使之重新成为一棵红黑树。
107.在有些实施例中,步骤6中判断该响应超时,将该消息从红黑树中删除,同时将该消息从定时任务去去除;引用计数减少,当引用计数值为零时,销毁对象的步骤包括:
108.判断该响应超时,将该消息从红黑树中删除,当引用计数不为零时,引用计数减一,将该消息从定时任务去去除,当引用计数不为零时,引用计数减一,当引用计数为零时,销毁该对象。
109.本发明使用两个后台线程,一个线程用于定时器的实现,该定时器采用时间轮实现。消息发送时,通过一个注册接口将消息和其超时处理函数注册到时间轮中,同时将消息加入到红黑树中,通过引用计数实现生命周期管理。定时器时间到,意味消息响应超时,调用超时处理函数,通过引用计数的值最终销毁对象。另外一个线程用于接收消息响应,在消息响应中通过查询红黑树判别消息是否是本进程发出去的,是的话做消息响应处理,不是的话丢弃该消息响应,同时通过引用计数将减少,最终销毁对象。具体的,当前程序需要发送消息时,构建一个消息对象,其包全局唯一的和进程有关的消息id,引用计数以及消息本身包含的必要信息。引用计数用来管理对象的生命周期。消息对象生成后,将消息id作为key值、对象本身作为value加入到红黑树中,同时引用计数加一。将该消息注册到定时器中,同时注册定时任务超时处理函数,对象引用计数加一。当前程序收到响应消息时,先从解析消息,获取该响应消息对应的消息id,将此消息id作为key值在上述的消息红黑树中进行查找,如果该消息id在红黑树中存在,意味着消息是当前进程发出的,并且没有当前消息
任务没有超时,这种情况下可以获取到红黑树中作为value的具体对象,进一步的处理该消息。消息处理完毕后则将其从定时器里删除,引用计数减一,同时从红黑树里删除,引用计数需要再次减一。每次引用计数改变时需要判断其是否为零,为零的话,需要销毁该对象。如果该消息id在消息红黑树中查找不到,意味着当前接收到的消息不是本程序发出去的,或者意味着消息任务已经超时,则放弃处理该消息。在某个消息的定时任务超时处理函数中,如果该消息的定时器时间到,即其超时处理函数被调用,则表明该消息超时、未能在定时器超时之前收到响应并正常处理。超时处理函数需要定义了超时情况下的消息处理逻辑,然后将该消息从消息红黑树删除,引用计数减一,超时处理函数被被调用后,定时器会将该消息从定时任务去去除,引用计数减一。如果过了超时时间,系统收到了该消息的的响应,因为消息已经被删除,所以不会再处理。需要说明的是,由于存在处理响应消息的任务可能比较耗时,在具体的实现方案中,针对耗时处理,可以通过使用线程池或者系统异步方法单独在其他线程中处理响应实现。在此不做赘述。
110.如图2所示,本发明实施例提供一种跨平台的异步消息处理装置,包括发送设置处理模块、接收设置处理模块;
111.发送设置处理模块,用于消息发送时,将消息和其超时处理函数注册到时间轮定时器中,同时将消息加入到红黑树中,设置引用计数增加;
112.接收设置处理模块包括接收判断单元、查询单元、响应处理单元、设置处理单元;
113.接收判断单元,用于接收响应消息,判断该消息的超时处理函数是否被调用;
114.查询单元,用于查询红黑树判别该消息是否存在;
115.响应处理单元,用于获取红黑树中的具体对象作响应处理;
116.设置处理单元,用于若红黑树中不存在该响应的消息,丢弃该响应消息,设置引用计数减少;若响应超时,将该消息从红黑树中删除,同时将该消息从定时任务去去除;引用计数减少,当引用计数值为零时,销毁对象。
117.在有些实施例中,发送设置处理模块包括构建单元、插入设置单元、注册设置单元;
118.构建单元,用于当需要发送消息时,构建一个消息对象;消息对象包括全局唯一的和进程有关的消息id,引用计数以及消息本身包含的信息,其中,引用计数用来管理对象的生命周期;
119.插入设置单元,用于消息对象生成后,将消息id作为key值、对象本身作为value加入到红黑树中,同时引用计数加一;
120.注册设置单元,用于将该消息注册到时间轮定时器中,同时注册定时任务超时处理函数,引用计数加一。
121.在有些实施例中,接收设置处理模块还包括解析单元、获取单元;
122.解析单元,用于接收并解析响应消息;
123.获取单元,用于获取该响应消息对应的消息id;
124.查询单元,具体用于将此消息id作为key值在红黑树中进行查找,判断该消息id在红黑树中是否存在。
125.在有些实施例中,响应处理单元包括响应子模块和和处理子模块;
126.响应子模块,具体用于获取红黑树中作为value的具体对象,进行消息响应处理;
127.处理子模块,用于消息处理完毕后则将其从时间轮定时器里删除,当引用计数不为零时,引用计数减一,同时从红黑树里删除,当引用计数不为零时,引用计数减一;当引用计数为零时,销毁该对象。
128.在有些实施例中,设置处理单元,具体用于判断该响应超时,将该消息从红黑树中删除,当引用计数不为零时,引用计数减一,将该消息从定时任务去去除,当引用计数不为零时,引用计数减一,当引用计数为零时,销毁该对象。
129.本发明实施例提供的一种计算机设备,该设备可以包括:处理器、通信接口、存储器和总线,其中,处理器,通信接口,存储器通过总线完成相互间的通信。总线可以用于电子设备与传感器之间的信息传输。处理器可以调用存储器中的逻辑指令,以执行如下方法:步骤1:消息发送时,将消息和其超时处理函数注册到时间轮定时器中,同时将消息加入到红黑树中,设置引用计数增加;步骤2:接收响应消息,判断该消息的超时处理函数是否被调用;若否,执行步骤3,若是,执行步骤6;步骤3:查询红黑树判别该消息是否存在;若存在,执行步骤4,若不存在,执行步骤5;步骤4:获取红黑树中的具体对象作响应处理;步骤5:丢弃该响应消息,引用计数减少;步骤6:判断该响应超时,将该消息从红黑树中删除,同时将该消息从定时任务去去除;引用计数减少,当引用计数值为零时,销毁对象。
130.此外,上述的存储器中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
131.本发明实施例提供一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质存储计算机指令,该计算机指令使计算机执行上述方法实施例所提供的方法,例如包括:步骤1:消息发送时,将消息和其超时处理函数注册到时间轮定时器中,同时将消息加入到红黑树中,设置引用计数增加;步骤2:接收响应消息,判断该消息的超时处理函数是否被调用;若否,执行步骤3,若是,执行步骤6;步骤3:查询红黑树判别该消息是否存在;若存在,执行步骤4,若不存在,执行步骤5;步骤4:获取红黑树中的具体对象作响应处理;步骤5:丢弃该响应消息,引用计数减少;步骤6:判断该响应超时,将该消息从红黑树中删除,同时将该消息从定时任务去去除;引用计数减少,当引用计数值为零时,销毁对象。
132.在一些具体的实施例中,所述可读存储介质中被处理器执行的程序指令,具体可以实现以下步骤:步骤11:当需要发送消息时,构建一个消息对象;消息对象包括全局唯一的和进程有关的消息id,引用计数以及消息本身包含的信息,其中,引用计数用来管理对象的生命周期;步骤12:消息对象生成后,将消息id作为key值、对象本身作为value加入到红黑树中,同时引用计数加一;步骤13:将该消息注册到时间轮定时器中,同时注册定时任务超时处理函数,引用计数加一。
133.在一些具体的实施例中,所述可读存储介质中被处理器执行的程序指令,具体可以实现以下步骤:步骤31:接收并解析响应消息;步骤32:获取该响应消息对应的消息id;步
骤33:将此消息id作为key值在红黑树中进行查找,判断该消息id在红黑树中是否存在。
134.在一些具体的实施例中,所述可读存储介质中被处理器执行的程序指令,具体可以实现以下步骤:步骤41:获取红黑树中作为value的具体对象,进行消息响应处理;步骤42:消息处理完毕后则将其从时间轮定时器里删除,当引用计数不为零时,引用计数减一,同时从红黑树里删除,当引用计数不为零时,引用计数减一;当引用计数为零时,销毁该对象。
135.尽管通过参考附图并结合优选实施例的方式对本发明进行了详细描述,但本发明并不限于此。在不脱离本发明的精神和实质的前提下,本领域普通技术人员可以对本发明的实施例进行各种等效的修改或替换,而这些修改或替换都应在本发明的涵盖范围内/任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献