默认
发表评论 3
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
适合萌新的Spring boot集成MobileIMSDK实践分享
       大家好,我是20届安卓应届生,在22年的时候,公司有个需求要做实时报表,脑子里第一个想到的就是用websocket来做,由于经验不足,连接几台设备之后就炸锅,中间踩了太多坑,比如Map集合封装的session老是冲突或丢失,心跳不稳,老是容易掉线,群发很卡或发不出去等各种问题,然后就被老板叼了。于是我跟我同学讲了这事,他就推荐给我这个即时通讯网站 ,当我点进来的时候,就被惊讶到了,一看就知道是大佬网站,跟着大佬学习。  

      进入今天的主题,因为我自己就是萌新,跟着我的视角,如何优雅正确的用Spring boot集成MobileIMSDK ,并且把离线消息存到Sql里,该Demo代码地址在文章最下面。      

运行效果:
适合萌新的Spring boot集成MobileIMSDK实践分享_551.png

适合萌新的Spring boot集成MobileIMSDK实践分享_66.jpg

第一步:去gitee上面下载MobileIMSDK

第二步:创建Spring boot项目

第三步:把下载好的MobileIMSDK里的gson-2.8.6.jar,MobileIMSDKServer.jar,netty-all-4.1.50.Final.jar放到resources下面创建一个lib文件存起来,然后在maven里引用<dependency>
                        <groupId>net.x52im.mobileimsdk.server</groupId>
                        <artifactId>MobileIMSDK4j</artifactId>
                        <scope>system</scope>
                        <version>1.0.0</version>
                        <systemPath>${project.basedir}/src/main/resources/lib/MobileIMSDKServer.jar</systemPath>
                </dependency>
                <dependency>
                        <groupId>com.google.code.gson</groupId>
                        <artifactId>gson</artifactId>
                        <version>2.8.6</version>
                </dependency>
                <dependency>
                        <groupId>com.rabbitmq</groupId>
                        <artifactId>rabbitmq-client</artifactId>
                        <scope>system</scope>
                        <version>1.9.4</version>
                        <systemPath>${project.basedir}/src/main/resources/lib/rabbitmq-client.jar</systemPath>
                </dependency>
                <dependency>
                        <groupId>io.netty</groupId>
                        <artifactId>netty</artifactId>
                        <scope>system</scope>
                        <version>1.0.0</version>
                        <systemPath>${project.basedir}/src/main/resources/lib/netty-all-4.1.50.Final.jar</systemPath>
                </dependency>



第四步:把下载过来的MobileIMSDK里Demo的3个java文件拷贝到自己的项目里,可以根据自己需求存放位置
   适合萌新的Spring boot集成MobileIMSDK实践分享_51.png


第五步:单独创建一个启动类,用来启动MobileIMSDK的服务,代码如下:
@Component
@Order(value = 1)
public class ChatServerRunner implements CommandLineRunner {
        
        @Autowired
        private ServerLauncherImpl sli;
        
    @Override
    public void run(String... strings) throws Exception {
        // 启动MobileIMSDK服务端的Demo
        sli.startup();
 
        // 加一个钩子,确保在JVM退出时释放netty的资源
        Runtime.getRuntime().addShutdownHook(new Thread(sli::shutdown));
    }
 
}
      
第六步:由于我们是Spring boot去启动,所以ServerLauncherImpl.java这个类里的Main启动方法就要干掉,并且由于ServerLauncherImpl加入了IOC,还要在ServerLauncherImpl上面加一个@Component注解,代码如下:
@Component
public class ServerLauncherImpl extends ServerLauncher
{
        @Autowired
        private ServerEventListenerImpl serverEventListenerImpl;
        @Autowired
        private MessageQoSEventS2CListnerImpl MessageQoSEventS2CListnerImpl;
        
        /**
         * 静态类方法:进行一些全局配置设置。
         */
        static
        {
                // 设置MobileIMSDK服务端的UDP网络监听端口
                GatewayUDP.PORT       = 7901;

                ServerLauncher.supportedGateways = Gateway.SOCKET_TYPE_UDP;
                
                // 开/关Demog日志的输出
                QoS4SendDaemonS2C.getInstance().setDebugable(true);
                QoS4ReciveDaemonC2S.getInstance().setDebugable(true);
        }
        
        /**
         * 实例构造方法。
         * 
         * @throws IOException
         */
        public ServerLauncherImpl() throws IOException
        {
                super();
        }
        
    /**
     * 初始化消息处理事件监听者.
     */
        @Override
    protected void initListeners()
    {
            // ** 设置各种回调事件处理实现类
                this.setServerEventListener(serverEventListenerImpl);
                this.setServerMessageQoSEventListener(MessageQoSEventS2CListnerImpl);
    }
        
}

第七步:细心的同学会发现,由于第六步的serverEventListenerImpl和MessageQoSEventS2CListnerImpl都依赖注入了,所以serverEventListenerImpl类和MessageQoSEventS2CListnerImpl类上加一个@Service注解就行了,目的是把这两个类加入到IOC才能依赖注入成功。

第八步:在ServerEventListenerImpl.java这个类的onTransferMessage_RealTimeSendFaild方法里可以做离线消息储存,这个方法的意思是消息发生出去没有回调通知就会触发,比如对方不在线,你给对方发消息,就会触发该方法。我们在这个方法里调用一个依赖注入的Dao层的接口,如果ImDao爆红不用慌,这是还没到下一步。代码如下:
     
@Autowired
        private ImDao imdao;
      
        @Override
        public boolean onTransferMessage_RealTimeSendFaild(Protocal p)
        {
                // 接收者uid
                String userId = p.getTo();
                // 发送者uid
                String from_user_id = p.getFrom();
                // 消息或指令内容
                String dataContent = p.getDataContent();
                // 消息或指令指纹码(即唯一ID)
                String fingerPrint = p.getFp();
                // 【重要】用户定义的消息或指令协议类型(开发者可据此类型来区分具体的消息或指令)
                int typeu = p.getTypeu();
                
                return imdao.saveMsgFaild(p);
        }

第九步:我们在onTransferMessage_RealTimeSendFaild方法里调用了一个依赖注入过来的imdao接口里的saveMsgFaild方法,用来保存离线记录,如果保存成功,则返回true,如果保存失败,则返回fasle,这就对应了客户端那边,如果返回为true就表示回调消息发送出去成功。然后我们在创建一个ImDao接口,代码如下:
@Mapper
public interface ImDao {

        /**
         * 储存离线
         */
        boolean saveMsgFaild(Protocal p);
}
   
第十步:没在Pom导入mybatis和的话,需要导入一下,要不然Mybatis不起作用,还有数据库驱动,这个根据你用什么数据库就导入什么驱动就行了,我以MySql为列,在yml配置好数据库后,在创建数据库,表名自定义,用于存Protocal对象的值就行,记得要在resources文件夹里写上Mapper sql语句。

Springboot集成MobileIMSDK的Demo地址




即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

214.png (105.22 KB, 下载次数: 197)

214.png
上一篇:[已回复] 研究mobileIMSDK源码的qos机制遇到的疑问下一篇:如何建立一个中转转发消息的客户端?

本帖已收录至以下技术专辑

推荐方案
评论 3
点赞。晚上我来帮你稍微优化下排版
引用:JackJiang 发表于 2023-06-09 12:11
点赞。晚上我来帮你稍微优化下排版

另一篇有关Spring boot集成MObileIMSDK的文章:
SpringBoot集成开源IM框架MobileIMSDK,实现即时通讯IM聊天功能
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部