资讯专栏INFORMATION COLUMN

项目的一点总结

tinylcy / 3380人阅读

摘要:项目名称后勤保障指挥系统项目部署环境银河麒麟系统基于的公司框架协议启动方式启功服务器脚本一键全启,第一次开启需要脚本文件名称进行授权。

项目名称:后勤保障指挥系统
项目部署环境:银河麒麟系统+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)中节点信息可实现路由信息同步,生成全局路由表且支持更新。
总之,这个项目比较大,我还是很庆幸能有这样的机会去参加这样的项目,这个项目技术不算新,但是很考验个人的基础知识以及对细节的把握,同时与众多不同领域的程序员对接程序让我对整个系统有了全面的了解,纠正了很多之前的不规范的编程习惯,先写这么多,有补充还会继续更新。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/10617.html

相关文章

  • 项目一点总结

    摘要:项目名称后勤保障指挥系统项目部署环境银河麒麟系统基于的公司框架协议启动方式启功服务器脚本一键全启,第一次开启需要脚本文件名称进行授权。 项目名称:后勤保障指挥系统项目部署环境:银河麒麟系统+myEclipse+mySql5.6+tomcat7+rabbitmq+基于ssm的公司框架+sip协议启动方式: 启功sip服务器:cd /home/wisdom/build_mpms/b...

    terro 评论0 收藏0
  • 关于Angular2组件通信---自己一点总结

    摘要:方便自己以后的使用。父组件使用子组件对象操控子组件传递信息或者调用方法。 这里简单的记录自己在angular2中,使用组件通信的一些方法。方便自己以后的使用。 一、组件之间通信的方式 使用事件通信(EventEmitter,@Output): 场景:可以在父子组件之间进行通信,一般使用在子组件传递消息给父组件; 步骤:a. 子组件创建事件EventEmitter对象,使用@outpu...

    leoperfect 评论0 收藏0
  • 关于Angular2组件通信---自己一点总结

    摘要:方便自己以后的使用。父组件使用子组件对象操控子组件传递信息或者调用方法。 这里简单的记录自己在angular2中,使用组件通信的一些方法。方便自己以后的使用。 一、组件之间通信的方式 使用事件通信(EventEmitter,@Output): 场景:可以在父子组件之间进行通信,一般使用在子组件传递消息给父组件; 步骤:a. 子组件创建事件EventEmitter对象,使用@outpu...

    joy968 评论0 收藏0
  • 【程序员】个人职业发展规划方法论分享(持续更新)

    摘要:文中涉及到的工具幕布插件番茄工作法助理原则原则是目标管理中的一种方法。作为职业发展规划的目标来说,一般人最好是制定一个中期的目标,时间长短在半年至三年内。所以这篇旨在分享我在做个人职业规划中的一些心得体会方法论思想等。 2019/07/14 UPDATE 本周想分享一下之前阅读过的一本书《坚持,一种可以养成的习惯》,这本书主要讲的是如何去养成一个习惯,在本次的初期职业目标的学习计划中,...

    h9911 评论0 收藏0
  • 回顾2017-让这个世界因为有了我,而有一点点的不一样

    摘要:转折年初的时候换了部门,主要是面向端企业的产品,很多方式确实和以前不一样。这也是自己给了个不及格的很大原因。这个也是在年中的紧急项目中学到的。不太急于做出承诺。 showImg(https://segmentfault.com/img/remote/1460000012682593?w=1174&h=492); 2017过去了,照例写一篇总结,以前也有写过年终总结,不过都是在博客或者本...

    马忠志 评论0 收藏0

发表评论

0条评论

tinylcy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<