接着上一篇,这次处理“维护当前可用的主题房间信息”问题。 每次使用startChild启动子进程的时候将当前的房间信息保存到ets表中。更重要的是每次主题房异常退出或重启都要更新对应的信息。
修改room_manager.erl中的内容:
新建一个函数来初始化房间信息表:
initTab()->
ets:new(roominfo,[public,
ordered_set,
named_table,
{keypos,#roominfo.id}
])
.
再添加对房间表数据操作的方法
addRoomInfo(Record)->
#roominfo{name=Name,type=Type}=Record,
case isRoomUniq([],Name,Type)of
{found,_Id}->
{fail,room_exists};
{not_found}->
RoomId=id_generator:getnewid("room"),
ClientTableName=list_to_atom(?PRIFIX++integer_to_list(RoomId)),
Info=Record#roominfo{id=RoomId,tablename=ClientTableName},
ets:insert(roominfo, Info),
{success,Info}
end
.
setRoomAvailble(Id)->
case ets:lookup(roominfo, Id) of
Record->
ets:update_element(roominfo, Id, {#roominfo.status,1}),
ok;
[]->
ok
end
.
setRoomUnavailble(Id)->
case ets:lookup(roominfo, Id) of
Record->
ets:update_element(roominfo, Id, {#roominfo.status,0}),
ok;
[]->
ok
end
.
removeRoom(Id)->
ets:delete(roominfo, Id)
.
为了方便后面的操作,再提供两个方法,一个根据给定的属性获取对应的ID,一个是判断对应ID的房间是否存在:
getRoomProperty(Id,Proper)->
case ets:lookup(roominfo, Id) of
Record->
#roominfo{name=Name,
type=Type,
unum=Unum,
tablename=Tab,
status=Status,
creationDate=Crdate}=Record,
case Proper of
#roominfo.name->
{ok,Name};
#roominfo.type->
{ok,Type};
#roominfo.unum->
{ok,Unum};
#roominfo.tablename->
{ok,Tab};
#roominfo.status->
{ok,Status};
#roominfo.creationDate->
{ok,Crdate};
_Els->
{fail,illegal_property}
end;
_Els->
{fail,not_found}
end
.
isRoomUniq([],Name,Type)->
case ets:all(roominfo) of
[R|L]->
#roominfo{id=Id,name=TheName,type=TheType}=R,
case string:equal("Name",TheName) and string:equal(Type, TheType) of
true->
{found,Id};
false->
isRoomUniq([L],Name,Type)
end;
[]->
{not_found}
end
;
isRoomUniq([L],Name,Type)->
case ets:all(roominfo) of
[R|L]->
#roominfo{id=Id,name=TheName,type=TheType}=R,
case string:equal("Name",TheName) and string:equal(Type, TheType) of
true->
{found,Id};
false->
isRoomUniq([L],Name,Type)
end;
[]->
{not_found}
end
.
再修改chat_room的terminate,从表中删除相应的记录:
terminate(_Reason,State)->
#roominfo{id=Id}=State,
room_manager:removeRoom(Id)
.
再修改房间启动时的初始化方法,房间的ID和名称从外部传入:
init([Para])->
id_generator:start_link(),
#roominfo{id=RoomId,tablename=ClientTableName}=Para,
client_manager:init(ClientTableName),
case is_record(Para,roominfo)of
true->
{ok,#roominfo{unum=0}=Para,tablename=ClientTableName};
Els->
{ok,#roominfo{id=RoomId,unum=0,name="room"++integer_to_list(RoomId),tablename=ClientTableName,type="def"}}
end
.
暂时不对代码进行测试,等后面整体修改完成后再一起测。
分享到:
相关推荐
**Erlang聊天室源码解析** Erlang是一种面向并发的编程语言,因其在分布式系统和高可用性服务中的出色表现,常被用于构建消息队列如RabbitMQ这样的项目。本篇将深入探讨一个基于Erlang实现的简单聊天室源码,帮助...
3. **聊天室房间管理**:可能有多个聊天室,用户可以选择加入或退出。这就需要一个房间管理模块来维护用户与房间的关系,以及管理各个房间的消息流。 4. **实时通信**:为了实现实时交互,可以使用Erlang的TCP/UDP...
构建这样的聊天室涉及到Erlang的并发特性、网络编程以及状态管理等多个方面,展示了Erlang在构建实时通信系统中的强大能力。通过学习和实践这个项目,开发者可以深入理解Erlang和OTP的设计原则,提升在分布式系统...
erlang-sd_notify-1.0-2.el7.x86_64.rpm
esl-erlang_16.b.3-2~centos~6_amd64.rpm
error: /tmp/esl-erlang_26.0.2-1~alinux~3_x86_64.rpm : not an rpm package (or packape manifest): arning: /tmp/rabbitmg-erver 3.12.4-1 all.rpm: Header V4 RSA/SHA512 Signature, key ID 6026dfca: NOKEY ...
2. Erlang-Java桥接库:为了方便Java与Erlang的交互,可能存在使用如Jinterface这样的库,它允许Java程序直接调用Erlang函数,或者通过Erlang的Port机制进行通信。 总结,这个项目展示了如何利用Erlang强大的并发和...
erlang-erts-19.3.6.4-1.el7.x86_64.rpm
erlang-xmerl-23.0.2-2.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
esl-erlang_24.2.1-1_centos_7_amd64.rpm
"erlang-rpm-21.3.4.zip"是一个包含Erlang版本21.3.4的RPM(Red Hat Package Manager)包的压缩文件,适用于Linux操作系统,尤其是基于RPM包管理系统的发行版,如CentOS、Fedora和RHEL等。 Erlang的主要特点包括: ...
本项目“erlang-java聊天”是一个初级水平的示例,展示了如何利用这两种语言进行交互,实现一个简单的聊天应用程序。这个聊天程序可能包括客户端和服务器端的组件,允许用户通过Erlang或Java环境进行实时通信。 **...
### Erlang与C语言程序接口详解 #### 一、引言 在软件开发领域,不同编程语言之间的交互是一项重要的技术。Erlang作为一种专为构建高并发、容错性强的应用程序而设计的语言,在与其他语言(如C语言)的集成方面具有...
erlang-crypto-19.3.6.4-1.el7.x86_64.rpm
esl-erlang_25.0.3-1_centos_7_amd64.rpm erlang_25.0.3-1 rpm用于rabitmq基础环境安装
Erlang程序设计(中文版-完整书签)&Erlang编程指南(中英文版)
最新最全rabbitmq与erlang版本匹配-2020-04-23
rpm包; 包含erlang-23.3-rabbitmq-server-3.8
标题中的"erlang-23.2.3-1.el7.x86_64.rpm"和"erlang-23.2.1-1.el7.x86_64.rpm.rar"代表了两个不同的Erlang版本。`.rpm`文件是用于Red Hat Enterprise Linux (RHEL) 和其衍生发行版如CentOS的软件包管理格式,而`....
- 使用yum安装Erlang:`sudo yum install erlang-23.3.4.3-1.el7.x86_64.rpm` 2. **安装RabbitMQ**: - 下载RabbitMQ RPM包:`wget https://your_download_link/rabbitmq-server-3.8.17-1.el7.noarch.rpm` - ...