1. 程式人生 > >推送服務

推送服務

由於這段時間做專案,需要到訊息推送,所以專門做一個推送訊息,包括裝置邀請,鎖的報警資訊等,做這個訊息推送,主要是前面tcp層響應要快,所以把一些資料庫查詢,或者訊息推送,寫到mq裡面,這樣子提高前面併發的連結,把這些訊息推送拿出來,作為一個專案。

專案的構造如上圖,沒有web.xml檔案,有點類似netty那些專案打包,所以在init包PushServerInit類中啟動檔案,

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();
	}
}
專案啟動之後,這有個applicationContext-rabbitmq_consumers.xml,這個是mq消費者,專門監聽寫入這個佇列的訊息,

這個類網上很多,可以查詢,這裡需要修改2個地方,第一個就是exchange和routingKey,佇列和鑰匙,自己填寫,其

次是<bean id="pushHandler" class="com.pushserver.rabbitmq.PushHandler"> 這個是我們自己處理訊息這個類。

我在rabbitmq包中寫了一個類PushHandler,這個是處理訊息的類,這裡主要是判斷一些有用的訊息才處理,比如

json格式

錯了,不處理,重要的是這裡會載入訊息處理類Map,然後找到對應的類類處理訊息,主要是spring包中

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推送還要一些證書的,自己載入。

大概就是這樣子。有錯的,請指出,本人菜鳥,慢慢成長中。。。。。