热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

会话线程安全吗?SMPPLogicaLibrary-IsSessionthreadsafe?SMPPLogicaLibrary

Iwanttoask..currentlyImusingSMPPLogicaLibrary..fordevelopingSMSCClientandImusings

I want to ask..currently I'm using SMPP Logica Library..for developing SMSC Client...and I'm using session.submit to send message to smsc server,Sending Message almost 50 message/second, and i want to use thread for multiple send ,,because I need every response from server to get Delivery Report...the questions is..is session.submit is thread safe?should i syncronized first the session before sending the message using thread? the code I use to send message is

我想问...目前我正在使用SMPP Logica Library ..开发SMSC客户端...我正在使用session.submit向smsc服务器发送消息,发送消息差不多50条消息/秒,我想要使用线程进行多次发送,因为我需要服务器的每个响应才能获得交付报告...问题是..是session.submit是线程安全的吗?我应该在使用线程发送消息之前首先同步会话吗?我用来发送消息的代码是

   {
        respOnse= session.submit(sm);
                  SUBMIT_SM_RESP(response,mt);
    ........

    }
         private void SUBMIT_SM_RESP(SubmitSMResp pdu,MTData mtd) {

              log.info("CommandID From PDU "+pdu.getCommandId());
              //SubmitSMResp submitSMResp = new SubmitSMResp();
              if (pdu.getCommandId() == Data.SUBMIT_SM_RESP ){
                //  submitSMResp.setData(pdu.getData());
                  switch (pdu.getCommandStatus())
                  {
                  case 0:
                    log.info("Berhasil kirim MT; SeqNo=" + pdu.getSequenceNumber() + ";" + pdu.debugString());
                    break;
                  case 1031:
                    log.info("Error. Service not found; SeqNo=" + pdu.getSequenceNumber() + ";" +pdu.debugString());
                    break;
                  case 1032:
                    log.info("Error. Invalid TX Id; SeqNo=" + pdu.getSequenceNumber() + ";" +pdu.debugString());
                    break;


 case 1033:
                log.info("Error. Push limit exceeded; SeqNo=" + pdu.getSequenceNumber() + ";" + pdu.debugString());
                break;
              case 4107:
                log.info("Error. Content Whitelisted (Testingmode); SeqNo=" + pdu.getSequenceNumber() + ";" +pdu.debugString());
                break;
              case 1280:
                  log.info("Insuficient Balance(Charging); SeqNo=" + pdu.getSequenceNumber() + ";" +pdu.debugString());
                break;
              }

              log.debug("MT rec status: CommandID=SUBMIT_SM_RESP; SeqNo=" + pdu.getSequenceNumber() + "; CommandSts=" + pdu.getCommandStatus() + pdu.debugString());
              //MTData mt = (MTData)DataInstance.getInstance().getHmSeqMT().get(Integer.valueOf(pdu.getSequenceNumber()));
              MTData mt =mtd;
              String tid = null;
              if (mt == null) {
                  log.info("MT null");
             //   if (DataInstance.getInstance().getHmSeqTrxID().containsKey(Integer.valueOf(pdu.getSequenceNumber()))) {
    //              tid = (String)DataInstance.getInstance().getHmSeqTrxID().get(Integer.valueOf(pdu.getSequenceNumber()));
    //              mt = DataInstance.getInstance().getDbPrs().getMTTrxID(tid);
    //              log.info("MT rec status: CommandID=SUBMIT_SM_RESP; SeqNo=" + pdu.getSequenceNumber() + "; CommandSts=" + pdu.getCommandStatus() + "; trxid=" + tid + "; " + pdu.debugString());
            //      if (mt == null) {
                    log.info("MT rec status: CommandID=SUBMIT_SM_RESP; SeqNo=" + pdu.getSequenceNumber() + "; CommandSts=" + pdu.getCommandStatus() + "; trxid=" + tid + " n/a; " + pdu.debugString());
                    mt = DataInstance.getInstance().getDbPrs().getMTSeqNo(String.valueOf(pdu.getSequenceNumber()));

            //     }
              //  }
              }
              else {
                  tid = mt.getTransid();
                  }
            //  log.info(mt.getClass());
             log.info("Transaction ID >>> "+mt.getTransid());
              if (mt != null) {
                DataInstance.getInstance().getDbPrs().deleteMT(mt, 
                  String.valueOf(pdu.getCommandStatus()), DataInstance.getInstance().getTransX().operator);
                DataInstance.getInstance().getHmSeqMT().remove(Integer.valueOf(pdu.getSequenceNumber()));
              } else {
                log.info("MT Null,,,Can't Send DR");
                log.info("MT n/a: SeqNo=" + pdu.getSequenceNumber() + "; CommandSts=" + pdu.getCommandStatus() + pdu.debugString());
              }
          }
          else
          {
              log.info("Nilai Enquiry Link "+Data.ENQUIRE_LINK_RESP);
          }
        }

Regards

Danz

1 个解决方案

#1


0  

In Synchronous mode it is always thread safe (like you are trying now). It is a totally different story going Asynchronous mode.

在同步模式下,它始终是线程安全的(就像您现在尝试的那样)。这是一个完全不同的故事,进入异步模式。


推荐阅读
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路
    本文介绍了FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路。当图表系列较多时,用户希望可以自己设置哪些系列显示,哪些系列不显示。通过调用FR.Chart.WebUtils.getChart("chartID").getChartWithIndex(chartIndex).setSeriesVisible()接口,可以获取需要显示的系列图表对象,并在表单中显示这些系列。本文以决策报表为例,详细介绍了实现方法,并给出了示例。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
author-avatar
轻裘缓带531
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有