项目名称:后勤保障指挥系统
项目部署环境:银河麒麟系统+myEclipse+mySql5.6+tomcat7+rabbitmq+基于ssm的公司框架+sip协议
启动方式:

    启功sip服务器:cd /home/wisdom/build_mpms/bin,./start.sh脚本一键全启,第一次开启需要chmod +x +脚本/文件名称 进行授权。
     需要对cd /home/wisdom/build_mpms/bin路径中的配置文件进行配置,将所有.ini 文件中的ip地址改成你要连接的服务器的地址,注意解除级联时的count=0.
    打开sc.log日志:tail -f /tmp/sc.log打开日志,里面有注册的信息(绿色字体)。
    
    启动rabbitmq: cd /usr/local/rabbitmq-3.5.2/sbin,运行./rabbitmq-server -detached
                   ps -ef|grep rabbitmq 观察是否有rabbitmq进程。
    启动mysql:cd /usr/local/mysql/bin,当前路径下运行./mysqld_safe &文件,符号代表后台运行。
    启动服务:cd /usr/local/JavaApp/wd_msg_center/ 运行./run.sh debug
             cd /usr/local/JavaApp/wd_mw_dal (data-access). ./run.sh debug
             cd /usr/local/JavaApp/wd_svc_resource (source-dir) ./run.sh debug
             cd /usr/local/JavaApp/wd_svc_authz (auth-service) ./run.sh debug
             cd /usr/local/JavaApp/wd_svc_session (session-manager) ./run.sh debug
             cd /usr/local/JavaApp/wd_agent_sip (sip-agent) ./run.sh debug
             cd /usr/local/tomcat/bin  当前路径下运行./catalina.sh run
             
             这段是调试时使用,真正部署时后台启动就可以了。

进入网址,http:// +ip地址 如果tomcat启动成功,可以看到登陆界面,更改服务资源与当前服务节点(与你连接的服务器ip保持一致)
如果一切顺利,安装技保终端,安装vs2015补丁就可以登陆了,(windows10安装补丁有错误,害我重新装的系统)
注意银河麒麟桥接模式,需要用户与服务器都要在同一个ip频段才能去连接。
我负责的是系统中的指挥业务模块,包括指挥组管理,指挥呼叫,临时添加非指挥组成员(在指挥过程中,下同),强退指挥组成员,指挥提醒,暂停指挥,专向指挥,协同指挥,授权指挥,接替指挥,越级指挥,临时指挥,呼叫组外人员,设置组播,调阅视频等等。
说说我个人觉得的技术难点以及“坑”:首先的难点在于对业务流程的理解,比如接替指挥,授权指挥,因为指挥组的成员结构是我缓存中的数据,因此在业务发起后的成员结构是怎样的构成需要慢慢理解(文档上的用语太书面,理解时半猜半懂的,需要及时的沟通)。
在理解业务后,编写的过程中要随时考虑系统的状态,以及你的缓存变化,还有接收通知或发送通知后的变化,任何的变化都有可能是你模块中的bug,如果你没有考虑的话。例如强退成员时,我们是将这个成员的某个状态字段更改,而不是直接将这个成员从这个缓存中删除,因此,在停止指挥时,我们要恢复原来的成员结构,被强退的成员需要在他的用户列表中看到原来的他所在的指挥组,这时在判断时(我需要与数据库中的原表比较,判断这个成员是增加的还是减少的)需要判断成员的状态,如果状态是剔除状态,要重新把他放入一个集合中,通过处理判断当前用户是否是原指挥组成员,是的就要在当前用户列表中显示这个组,不是就要删除这个组信息。

一、
for(SimpleUser simpleUser:members){
            //表示删除的成员状态
            if(!"2".equals(simpleUser.getBizStatus())){
                simpleIdList.add(simpleUser.getId());
            }

二、
//求差集,这不重要            
changedIdList.addAll(memberIdsByData);
changedIdList.retainAll(simpleIdList);
memberIdsByData.removeAll(changedIdList);
if(memberIdsByData.size() != 0){
    for(String memberId:memberIdsByData){
        //在缓存中添加组信息
        addGroupCache(memberId, groupWithMembers);
    }
}
simpleIdList.removeAll(changedIdList);
if(simpleIdList.size() != 0){
    for(String memberId:simpleIdList){
        //删除这个缓存中的这个组信息
        deleteGroupCache(memberId, directGroup.getId());
    }
}

还有缓存的维护虽然没什么难点,但是逻辑要清晰,细节很重要,否则有的bug真的欲仙欲死,debug时那叫一个酸爽......
有一个坑我印象很深刻,因为那天第三方测试,忙了一宿,系统的服务都已部署在生产环境中,大家都很紧张,偏偏我的业务(就是那个强退成员)无法实现,报了异常(json转换异常,很奇怪)可是我们自测时在本地运行时业务是没有问题的,我又加了一夜的班(悲催),找到原因,由于之前的一个接口没有用上,但考虑以后扩展,就一直没有注释掉,偏偏它的uri地址与强退成员接口的uri一模一样,导致在生产环境中根本没有扫描到我的强退成员接口,报异常也就不奇怪了。在我注释掉那个扩展接口后,系统正常。
再说说这个项目的动态信息同步以及静态信息同步策略,先说动态信息同步,动态信息同步采用订阅-发布级联模型实现,在SIP标准规范上,PUBLISH和SUBSCRIBE/NOTIFY为两种不同的事务,在动态信息同步中必须依据订阅-发布级联模型的时序图实现,需先SUBSCRIBE订阅,后续才使用PUBLISH事务。在此项目中,第一次订阅的节点需全量同步(NOTIFY和PUBLISH均全量),后续均增量同步(NOTIFY和PUBLISH均增量)。静态信息同步(路由信息同步)使用LDAP,即静态信息管理(LDAP)中节点信息可实现路由信息同步,生成全局路由表且支持更新。
总之,这个项目比较大,我还是很庆幸能有这样的机会去参加这样的项目,这个项目技术不算新,但是很考验个人的基础知识以及对细节的把握,同时与众多不同领域的程序员对接程序让我对整个系统有了全面的了解,纠正了很多之前的不规范的编程习惯,先写这么多,有补充还会继续更新。


nemo
3 声望0 粉丝

一个有点无聊的程序员,如果有一天,程序会说谎,我会不会依旧喜欢这个行业......写一点自己的东西,别虚度了时间,希望自己能坚持写下去。