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

本来公司招进来的时候是做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.特别感谢他
[url=http://www.blogjava.net/open-cmpp/archive/2006/06/27/55247.html]他的blog[/url]

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

分多页写
[list]
[*][url=http://rikugun.iteye.com/blog/296384]半桶水开发 CMPP2.0 with Spring + JPA 1[/url]
[*][url=http://rikugun.iteye.com/blog/296439]半桶水开发 CMPP2.0 with Spring + JPA 2[/url]
[*][url=http://rikugun.iteye.com/blog/297369]半桶水开发 CMPP2.0 with Spring + JPA 3[/url]
[/list]

首先看一下结构:
[quote][list]
[*]Send 表
短信待发送表
[*] Log 表
短信发送日志表
[*] Deliver 表
短信网关下发的短信表
[/list][/quote]
我要负责的业务就是扫描短信发送表,查找到符合条件的记录(比如发送到移动的),接发送到短信网关,如果成功就插入记录到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...");
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值