推送服務
阿新 • • 發佈:2018-11-06
由於這段時間做專案,需要到訊息推送,所以專門做一個推送訊息,包括裝置邀請,鎖的報警資訊等,做這個訊息推送,主要是前面tcp層響應要快,所以把一些資料庫查詢,或者訊息推送,寫到mq裡面,這樣子提高前面併發的連結,把這些訊息推送拿出來,作為一個專案。
專案的構造如上圖,沒有web.xml檔案,有點類似netty那些專案打包,所以在init包PushServerInit類中啟動檔案,
專案啟動之後,這有個applicationContext-rabbitmq_consumers.xml,這個是mq消費者,專門監聽寫入這個佇列的訊息,package com.pushserver.init; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class PushServerInit { private static ApplicationContext context = null; public PushServerInit() { start(); } public void start() { try{ context = new ClassPathXmlApplicationContext("applicationContext-base.xml"); } catch (Exception err) { err.printStackTrace(); return; } finally { } } public static void main(String[] args) { new PushServerInit(); } }
這個類網上很多,可以查詢,這裡需要修改2個地方,第一個就是exchange和routingKey,佇列和鑰匙,自己填寫,其
次是<bean id="pushHandler" class="com.pushserver.rabbitmq.PushHandler"> 這個是我們自己處理訊息這個類。
我在rabbitmq包中寫了一個類PushHandler,這個是處理訊息的類,這裡主要是判斷一些有用的訊息才處理,比如
json格式
SpringContextHolder載入這些類,因為這裡每個訊息處理類都有一個InfoType,根據InfoType來找到具體的類來處理,
這些類實現一個介面
package com.topband.pushserver.type.inter;
import java.util.Map;
public interface PushMessage {
public Integer getInfoType() throws Exception;//每個類的InfoType,訊息必須帶上來,否者不處理
public void pushMessage(Map map,int infoType)throws Exception;//類具體的業務處理
}
這些類也繼承一個父類,BasePushMessage,主要是一些公用的方法或者變數。
當你業務處理完,需要返回資料;
第一:先把資料寫到mq就可以了,按照一定格式
PushMessageBene pmb=new PushMessageBene();//訊息返回處理類
String alert=getAlertResponse(userName,phone,email,deviceName,result);
pmb.setText(alert);
pmb.setInfoType(infoType);
pmb.setData(data); // 把它變json再用MqUtil.sendResponse處理就可以
MqUtil.sendResponse(jRedisClient, messageProducer, subSessionId, JsonUtil.toJSON(pmb));
String message=getIOSPushString(pmb.getSerial(), infoType, type, deviceId);// 這個是互相確認ios的訊息格式
sendAPNS(main_userId, message, alert, "", infoType, type);//具體的推出去的有個方法如下
threadPool.server(token, message, alert, sound, jRedisClient, userId,infoType, type);//專門有執行緒推出去,方法類如下
package com.pushserver.push.ios;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.topband.cloud.common.redis.JRedisClient;
import com.topband.cloud.entity.Token;
import redis.clients.jedis.JedisCluster;
public class ThreadPool {
private ExecutorService exe = null;
private static final int POOL_SIZE = 100;
private IOSPushServerDbay iosPushServerDbayDefault;
public ThreadPool() {
exe = Executors.newFixedThreadPool(POOL_SIZE);
System.out.println("the server is ready...");
}
public void server(Token token, String message, String alert, String sound,
JRedisClient jRedisClient, String userId, int infoType,int type) {
String tokenStr = token.getPhoneToken();
String source = token.getSource();
IOSPushServerDbay iosPushServerDbay;
iosPushServerDbay = iosPushServerDbayDefault;
exe.execute(new WorkerIosPush(iosPushServerDbay, tokenStr, message, alert, sound, jRedisClient, userId,infoType,type));
}
class WorkerIosPush implements Runnable {//
private String token;
private String message;
private String alert;
private String sound;
private JRedisClient jRedisClient;
private String userId;
private IOSPushServerDbay iosPushServerDbay;
private int infoType;
private int type;
WorkerIosPush(IOSPushServerDbay iosPushServerDbay, String token, String message,
String alert, String sound, JRedisClient jRedisClient, String userId, int infoType,int type) {
this.token = token;
this.message = message;
this.alert = alert;
this.sound = sound;
this.jRedisClient = jRedisClient;
this.iosPushServerDbay = iosPushServerDbay;
this.userId = userId;
this.infoType=infoType;
this.type= type;
}
@Override
public void run() {
iosPushServerDbay.pushMessage(token, message, alert, sound, jRedisClient, userId, infoType,type);
}
}
public IOSPushServerDbay getIosPushServerDbayDefault() {
return iosPushServerDbayDefault;
}
public void setIosPushServerDbayDefault(
IOSPushServerDbay iosPushServerDbayDefault) {
this.iosPushServerDbayDefault = iosPushServerDbayDefault;
}
}
這些ios推送還要一些證書的,自己載入。
大概就是這樣子。有錯的,請指出,本人菜鳥,慢慢成長中。。。。。