前面已经实现了第一版实时消息推送核心框架搭建,下面就在第一版基础上加以升级完善。
使用技术框架:分布式调度 http://git.oschina.net/hugui/light-task-scheduler 请自行玩玩 这里简单介绍下。
light-task-scheduler 调度框架基本原理和第一版实现一样不过这里更加完善的是该框架实现了消息重发,当消息失败消息会被重新保存起来定期重发这里可以具体了解下框架自身原理,该框架本身已是生产者-消费者模式 在升级版中主要使用到了 jobclient:产生消息 jobtracker:处理连接client和task tasktracer:负责处理任务 queue:消息队列支持数据库队列 。在使用该框架的是时候需要打包jar在项目中引入。具体框架整合可以了解下框架本身。下面主要贴上消息生产 处理 以及自身使用redis作为消息存取配合任务调度使用
消息生产:
@Override
public void sendMessage(Message msMessage) {
//写入redis缓存系统队列
if(redisUtils.redisCheckStatus()){
String id=UUID.randomUUID().toString();
ArrayList<Message> messages=new ArrayList<Message>();
msMessage.setRedisstatus(1);//进入redis队列
msMessage.setId(id);
//消息加入redis
redisUtils.addMessageQueue(id, msMessage);
Job job = new Job();
job.setTaskId(id);
job.setParam("messageid",id);
job.setTaskTrackerNodeGroup("message_trade_TaskTracker"); //
job.setNeedFeedback(true);
job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新
job.setCronExpression(null);//立即执行
Response response = jobClient.submitJob(job);
logger.info("执行结果:"+response.getMsg());
}else{
msMessage.setRedisstatus(0);//未进入redis队列
}
//写入数据库 防止消息丢失
try {
Session session=getHibernateTemplate().getSessionFactory().openSession();
Transaction transaction=session.beginTransaction();
session.save(msMessage);
transaction.commit();
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
消息处理:
@Override
public Result run(Job job) throws Throwable {
Result result=null;
try {
// TODO 业务逻辑
logger.error("我要执行:" + job);
String messageid=job.getParam("messageid");
boolean backresult=true;
if(!StringUtils.isEmpty(messageid)){
Message message=redisUtils.getMessageQueue(messageid);
if(message!=null){
backresult=sendMsg(message);//发送消息
if(backresult){
result=new Result(Action.EXECUTE_SUCCESS, "推送成功");
}else{
result=new Result(Action.EXECUTE_LATER, "推送失败,稍后重新推送");
}
}
}
} catch (Exception e) {
logger.info("Run job failed!", e);
result=new Result(Action.EXECUTE_LATER, e.getMessage());
}
return result;
}
注意:
<1.消息发送失败需要返回 new Result(Action.EXECUTE_LATER, "推送失败,稍后重新推送"); 通知任务调度该任务需要重发
<2.redis消息取出使用pop该消息就会重redis中删除 注意。。。
升级主要解决自行定时任务,以及消息发送失败重发机制实现。下面把相关代码贴上 没有jar包
dubbo-demo-provider:消息处理系统 dubbo-demo-consumer:测试端
相关推荐
NULL 博文链接:https://1028826685.iteye.com/blog/2267689
apollo实现c#与android消息推送 需要的软件和包是apache apollo的代理服务器
golang 推送系统 单机 客户端通过websocket连接到服务端 ...服务端从rabbitmq接收消息,根据消息所属通过websocket推送到具体用户 服务端从http api接收消息,根据消息所属通过websocket推送到具体用户
基于SpringBoot、RabbitMQ的Android消息推送平台搭建。亲测可用。有的公司对所要推送的消息保密要求比较高,不希望被第三方看到,可以使用此种方式进行消息推送。如果所要推送的人群比较多,可以搭建RabbitMQ集群...
使用dwr+spring实现消息推送 。
java二次开发接微信公众号接口,实现根据用户授权,获取用户code,再获取openid,然后向其推送模版消息
java实现企业微信消息推送
WebForm实现消息推送
WebForm实现消息推送源码 功能介绍: 假设A,B,C用户登陆,内存记录下已登录的用户的信息,这时A在所在的客户端(SendInfo.aspx)页面向B发消息,则在B所在客户端页面(SendInfo.aspx)将弹出消息框。 关键点有两个: 1...
该资源实现了基于Android端的socket长连接编程消息推送,很好的模仿了QQ消息的推送原理。支持p2p、s2p消息推送
已经实现的功能: 1.服务器定时推送(多个机器测试通过) 2.服务器端能够撤销已经发送的推送通知 3.服务器端实时发送消息(多个机器) 4.客户端接受推送,并且不能强制关掉 5.客户端缩小到任务栏小图标,不能被关闭 ...
APNS(Apple Push Notification Service)苹果推送通知服务。该技术由苹果公司提供的APNS服务。工作原理:首先,APNS会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书已确定其为...
springboot实现微信公众号模版消息推送,用的是构架:springboot+redis,详细教程:https://blog.csdn.net/chenhongming888/article/details/95173079
Andorid消息推送Demo,官网下载的有点小问题,这里作一些修改
这是WebForm实现消息推送的源码,使用的是vs2010
springMVC+dwr技术实现消息推送实例,简单实例演示如何用dwr实现后台向前台主动推送消息
SpringBoot+WebSocket实现消息推送,SpringBoot+WebSocket+SpringSecurity实现聊天室
android 通过百度云推送实现消息的推送