`
rikugun
  • 浏览: 349711 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

半桶水开发 CMPP2.0 with Spring + JPA 1

    博客分类:
  • JAVA
阅读更多
    本来公司招进来的时候是做PHP,简历哪里手多写了会Java.结果现在做的短信增值平台要用JAVA做网关接口,把我给逮住了.只能硬着头皮上了.
生成环境:
OS: Mac OSX 10.5.6
DB: Oracle 9i
Java:dev on JDK 5 run on JDK6
JAVA IDE : netbeans6.5 path 1
Java framework : Spring 2.5 Hibernate 3 with JPA Open-CMPP

注:
关于Open_CMPP,本来用的短信库是华为那个,可是上头给我的库有问题,构造发送短信的时候死活有问题.还好找到了一个反编译的类库,用法完全跟华为的一样.作者还改了一些BUG.特别感谢他
他的blog

小结一下主要技术:
呃,主要是想学习一下在注解的支持下开发 Spring+JPA,还有用到JDK5 的多线程技术 的开发.

分多页写


      首先看一下结构:
引用
  • Send 表
  • 短信待发送表
  • Log 表
  • 短信发送日志表
  • Deliver 表
  • 短信网关下发的短信表
       

       我要负责的业务就是扫描短信发送表,查找到符合条件的记录(比如发送到移动的),接发送到短信网关,如果成功就插入记录到Log表.还有一个线程是一直监听移动短信网关的下发短信,收到后记录到Rec表中
        这样目前我就有2个Service
        SendThreadService.java
/**
 *
 * @author rikugun
 */
public class SendThreadService implements Runnable {

    @Autowired
    SendDao sendDao; //Send表的Dao
    @Autowired
    LogDao logDao;  //Log表的Dao
    @Autowired
    CMPPProxy CMPPProxy;  //短信代理
    private Logger log = Logger.getLogger(SendThreadService.class.getName());
    private final int sendinterval = 1; //puase seconds  每次发送后等待时间(秒)
    private final int Max_sms = 10;    //每次最多从Send 表中取记录的条数
//TODO 以后改成从配置文件中读取

    /*
     *  发送成功后插入到Log表中,然后将Send中那条记录删掉
     *  @param SpSmsSend 要发送的短信
     */
    @Transactional
    void insertLog(SpSmsSend sms) throws PreexistingEntityException, Exception {
        //将SpSmsSend转换成SpSmsLog后保存
        SpSmsLog sms_log = (SpSmsLog) sms;
        sms_log.setSendTime(new Date(System.currentTimeMillis()));
        logDao.create(sms_log);
        sendDao.destroy(sms.getId());
    }

    @Override
    public void run() {
        while (true) {
//获取业务类型是移动的短信 smsOperator为业务类型(移动)
            List<SpSmsSend> order_to_send = sendDao.findCMPPEntities(Max_sms, 0);
            log.log(Level.INFO, "Start to Send " + order_to_send.size() + " Messages...");
            for (int i = 0; i < order_to_send.size(); i++) {
                SpSmsSend sms = order_to_send.get(i);
                log.log(Level.INFO, "Sending [" + sms.getSmsLsh() + "]");
//将SpSmsSend 转换为 华为CMPP包的格式
                CMPPSubmitRepMessage result = CMPPProxy.sendWithRep(TypeConv.toCMPP(order_to_send.get(i)));
                if (result.getResult() == 0) {
                    try {
                        insertLog(sms);
                    } catch (PreexistingEntityException ex) {
                        Logger.getLogger(SendThreadService.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (Exception ex) {
                        Logger.getLogger(SendThreadService.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    log.log(Level.INFO, "Success Sended!");
                } else {
                    log.log(Level.WARNING, "Send Failed!");
                    log.log(Level.WARNING, "Error code = " + result.getResult());
                }
                try {
                    Thread.sleep(1000 * sendinterval);
                } catch (Exception exception) {
                    exception.printStackTrace();
                }

            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                log.log(Level.SEVERE, null, ex);
            }
        }
    }
}


收取下发的短信的线程
DeliverThreadService.java
/**
 *
 * @author rikugun
 */
public class DeliverThreadService implements Runnable {

    private final int sleeptime = 1;
    private Logger log = Logger.getLogger(DeliverThreadService.class.getName());
    @Autowired
    CMPPProxy CMPPProxy;
    @Autowired
    DeliverDao deliverDao;
    BlockingQueue<CMPPDeliverMessage> queue;
    private SpSmsDeliver deliver = null;

    @Override
    public void run() {
        queue = CMPPProxy.getDeliveMsgs();

        while (true) {
            log.log(Level.INFO, "Waiting for Deliver..");
            try {
               //从队列中取得下发短信
                CMPPDeliverMessage msg = queue.take();
                deliver = new SpSmsDeliver(msg.getDestnationId());
                deliver.setContent(msg.getMsgContent().toString());
                deliver.setResTime(new Date(System.currentTimeMillis()));
                deliver.setSmsOperator(1);
                deliver.setMobileNo(msg.getSrcterminalId());
                try {
                    deliverDao.create(deliver);
                } catch (PreexistingEntityException ex) {
                    log.log(Level.SEVERE, null, ex);
                } catch (Exception ex) {
                    log.log(Level.SEVERE, null, ex);
                }
                log.log(Level.FINE, msg.toString());
                Thread.sleep(1000 * sleeptime);
            } catch (InterruptedException ex) {
                log.log(Level.SEVERE, null, ex);
            }
            log.log(Level.FINE, "Still Waiting...");
        }
    }
}
2
0
分享到:
评论
1 楼 萌蜗牛 2016-09-26  
我也用华为smproxy包发送短信,运行一会儿后总是间隔一段时间报异常:java.lang.IllegalArgumentException: 定义响应激活请求的消息参数输入有误:success_Id小于0或大于255,请问楼主遇到过没?怎么解决,求分享!!!不甚感激!!!

相关推荐

    中国电信CMPP2.0原代码+程序

    1. CMPP2.0协议概述: CMPP2.0是CMPP协议的一个升级版本,主要优化了协议性能,提高了数据传输效率和系统的稳定性。它支持多种业务类型,如普通短信、彩信、WAP推送等,并且支持批量提交和长短信的拆分与合并。 2....

    cmpp2.0移动网关+数据库操作

    在IT行业中,理解和掌握CMPP2.0协议对于开发与移动网络相关的应用和服务至关重要。 CMPP2.0协议的特点: 1. **高并发**:设计上支持大规模并发连接,能处理大量的短信请求,确保在高峰期也能稳定运行。 2. **高效性...

    cmpp2.0 java实现

    CMPP2.0协议是中国移动通信集团制定的一种短消息传输协议,主要用于SP(Service Provider)与SCP(Service Control Point)之间的数据交换,支持大规模、高效、稳定地发送和接收短信。在Java环境中实现CMPP2.0协议,...

    中国移动CMPP2.0短信接口开发

    本文将深入探讨CMPP2.0短信接口开发在C#环境中的应用。 1. **CMPP协议概述**: - CMPP协议是基于TCP/IP的通信协议,用于SP与移动运营商之间的数据传输,确保消息能够可靠、快速地发送到用户手机。 - CMPP2.0主要...

    java代码cmpp 2.0简单示例绝对可用

    Java代码实现CMPP 2.0协议是一种在移动通信领域常见的技术,主要用于短信服务。CMPP(China Mobile Packet Protocol)是中国移动制定的一种基于TCP/IP的通信协议,用于连接SP(Service Provider)与SCP(Service ...

    cmpp2.0短信网关发送短信代码(java)

    CMPP2.0短信网关发送短信代码是Java开发者用于与中国移动通信集团的短信服务进行交互的一种技术实现。CMPP(China Mobile Short Message Peer-to-Peer)2.0协议是移动运营商提供的一种通信协议,主要用于短信业务的...

    CMPP2.0协议技术

    CMPP2.0协议技术是中国移动通信领域中的一个重要标准,主要用于短信服务提供商(SP)与移动短信中心(SMSC)之间的数据传输。该协议详细定义了业务应用与短信中心之间的接口,确保了短信发送、接收的高效、稳定与...

    CMPP2.0短信网关接口开发文档

    CMPP2.0短信网关接口开发文档 CMPP2.0短信网关接口开发文档是中国移动通信集团公司发布的一份关于短信网关开发协议的文档。该文档详细介绍了CMPP2.0协议的技术细节和实现方法,为开发者提供了详细的开发指南和技术...

    采用华为包开发JAVA移动短信CMPP2.0/CMPP3.0

    本人亲测可用采用华为包开发的JAVA移动短信CMPP2.0/CMPP3.0程序,希望能够帮到你

    中国移动通信CMPP2.0模拟网关

    1. **连接管理**:CMPP2.0支持单连接和双连接模式。单连接模式适用于小型应用,而双连接模式则提高了数据传输的稳定性和可靠性,适合大型应用。在双连接模式下,一条连接用于发送请求,另一条用于接收响应,降低了因...

    中国移动CMPP2.0服务器端模拟器

    1.遵照CMPP2.0协议实现,模拟了短信网关,支持CONNECT,SUBMIT,DELIVER,QUERY,CANCEL,TERMINATE消息。 2.支持多个客户端登录,支持单连接和双连接类型,支持标准CMPP和亚信API. 3.服务端自动生成Msgid,支持状态报告. ...

    中国移动cmpp2.0模拟器

    中国移动的CMPP2.0(China Mobile Packet Protocol version 2.0)协议是通信行业中用于短信服务的重要标准,尤其在企业级应用中广泛使用。这个协议定义了SP(Service Provider,服务提供商)与SCP(Service Control ...

    cmpp2.0模拟短信网关

    这个模拟短信网关实现是一个用于测试和开发短信应用的工具,它能够帮助开发者在不依赖真实网络环境的情况下,对CMPP2.0协议进行模拟交互和功能验证。 **CMPP2.0协议概述:** CMPP2.0协议是基于TCP/IP的通信协议,...

    cmpp2.0开发接口c#

    C#是一种常用的编程语言,用于实现CMPP2.0接口可以方便地在.NET环境下进行短信服务的开发。 CMPP2.0协议主要包括以下几个主要部分: 1. 连接管理:CMPP连接通常基于TCP/IP协议,开发者需要建立并维护与SMSC的长...

    CMPP 2.0网关模拟器

    CMPP 2.0网关模拟器则是开发和测试CMPP应用的重要工具,它可以帮助开发者在没有实际网关环境的情况下进行功能验证和性能测试。 CMPP 2.0协议的核心知识点包括以下几个方面: 1. **协议结构**:CMPP协议基于TCP/IP...

    中国移动短信CMPP 2.0协议API

    中国移动短信CMPP 2.0协议API是一种专用于短信服务的通信协议,广泛应用于移动通信领域,特别是企业级应用,如验证码发送、信息推送等。该协议基于TCP/IP,为服务提供商提供了高效、稳定且安全的短信发送和接收功能...

    CMPP2.0-Java源代码带工具.rar

    1.遵照CMPP2.0协议实现,模拟了短信网关,支持CONNECT,SUBMIT,DELIVER,QUERY,CANCEL,TERMINATE消息。 2.支持多个客户端登录,支持单连接和双连接类型,支持标准CMPP和亚信API. 3.服务端自动生成Msgid,支持状态报告. ...

    中国移动短信网关模拟器支持cmpp2.0

    中国移动短信网关模拟器是为开发者和测试人员提供的一种工具,它能够模拟中国移动的CMPP2.0协议,用于测试和验证短信应用的正确性和效率。CMPP2.0(China Mobile Short Message Peer-to-Peer Protocol version 2.0)...

    CMPP 2.0 C# 源码

    CMPP 2.0是该协议的一个版本,它在CMPP 1.0的基础上进行了优化和增强,提高了系统的稳定性和处理能力。在C#中实现CMPP 2.0的源代码,可以为开发者提供一套高效且可靠的短信服务平台。 本文将详细介绍CMPP 2.0协议的...

Global site tag (gtag.js) - Google Analytics