在web应用中,对存储在数据库中的待推送消息取出并推送到对应的IOS设备。
环境以及开发包:
- JDK - 1.7
- apns-0.1.5-jar-with-dependencies.jar(ios推送用)
定时任务
在Web应用启动后,开启一条线程,每隔15s执行一次查询,取出待推送的消息。
- 设置定时器
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class TimerPush implements ServletContextListener {
public static final long PERIOD_MIN = 1 * 15000; //间隔15s
public static final long DELAY = 1 * 5000; //延迟执行5s
private Timer timer;
///************* 在Web应用启动时初始化任务 ******************/
public void contextInitialized(ServletContextEvent event) {
timer = new Timer("****启动推送任务****",true); //定义定时器
timer.schedule(new PushTask(),DELAY, PERIOD_MIN); //启动PushTask任务,每15s执行一次,延迟执行5s
}
///************** 在Web应用结束时停止任务 *******************/
public void contextDestroyed(ServletContextEvent event) {
timer.cancel(); // 定时器销毁
}
}
- 启动定时任务
import java.util.TimerTask;
public class PushTask extends TimerTask {
private static boolean isRunning = false;
public void run() {
if (!isRunning) {
isRunning = true;
System.out.println("开始执行任务...");
///********** 开线程查询是否有待推送任务并进行推送 *******************/
/**
若使用run线程,查询事务会在web应用结束后才结束,那么推送成功之后,推送结果就无法保存到数据库(已经避免了不可重复读取)。
**/
SqlThreadForPush sqlThread = new SqlThreadForPush();//查询以及推送
Thread thread = new Thread(sqlThread);
thread.start();
isRunning = false;
thread.interrupt();
try{
thread.join();
}catch (InterruptedException e){
e.printStackTrace();
}
///********** 结束查询线程 *******************/
System.out.println("本次任务已结束..."); //任务结束
}else {
System.out.println("上一次任务执行还未结束..."); //上一次任务未结束
}
}
}
IOS推送
此处为简单的推送情况
import com.notnoop.apns.APNS;
import com.notnoop.apns.ApnsService;
/*
* 查询当前待推送任务
*/
public class SqlThreadForPush extends PushTask implements Runnable{
public void run(){
ApnsService service =
APNS.newService()
.withCert("/tools/apns/123.p12", "123456") ///证书位置,证书密码
.withSandboxDestination() //测试和发布地址不同
.build();
try {
service.testConnection();
String payload = APNS.newPayload().alertBody("有无收到,我系Mjay").badge(1).sound("default").build();//body放推送内容,badge就是应用上显示的数字
String token = "00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000";//ios设备号
service.push(token, payload);
} catch (Exception e) {
e.printStackTrace();
return ;
}
System.out.println("已保存本次推送结果..."); //任务结束
}
}