mqtt协议实现 java服务端推送功能(三)项目中给多个用户推送功能
接着上一篇说,上一篇的TOPIC是写死的,然而在实际项目中要给不同用户 也就是不同的topic进行推送 所以要写活
package com.fh.controller.information.push;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.fh.controller.base.BaseController;
import com.fh.entity.Page;
import com.fh.entity.system.User;
import com.fh.service.information.push.PushService;
import com.fh.service.system.dept.DeptService;
import com.fh.util.Const;
import com.fh.util.DateUtil;
import com.fh.util.PageData;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
/**
* @author zzm
* mqtt给80服务端推送功能
*/
@Controller
@RequestMapping(value="/push")
public class PushController extends BaseController{
@Resource(name="deptService")
private DeptService deptService;
@Resource(name="pushService")
private PushService pushService;
// tcp://MQTT安装的服务器地址:MQTT定义的端口号
public static final String HOST = "tcp://192.168.10.80:1883";
// 定义一个主题
//public static final String TOPIC = "IM/admin/Inbox";
// 定义MQTT的ID,可以在MQTT服务配置中指定
private static final String clientid = "server11";
private static MqttClient client;
private static MqttTopic topic11;
private String userName = "admin";
private String passWord = "admin";
private MqttMessage message;
/**
* 构造函数
*
* @throws MqttException
*/
public PushController() throws MqttException {
// MemoryPersistence设置clientid的保存形式,默认为以内存保存
client = new MqttClient(HOST, clientid, new MemoryPersistence());
connect();
}
/**
* 用来连接服务器
*/
private void connect() {
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false);
options.setUserName(userName);
options.setPassword(passWord.toCharArray());
// 设置超时时间
options.setConnectionTimeout(10);
// 设置会话心跳时间
options.setKeepAliveInterval(20);
try {
client.setCallback(new PushCallback());
client.connect(options);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @param topic
* @param message
* @throws MqttPersistenceException
* @throws MqttException
*/
public void publish(MqttTopic topic, MqttMessage message) throws MqttPersistenceException, MqttException {
MqttDeliveryToken token = topic.publish(message);
token.waitForCompletion();
System.out.println("message is published completely! " + token.isComplete());
}
/**
* 保存
*/
@RequestMapping(value="/save")
public ModelAndView save(HttpServletRequest request,
@RequestParam(value="title",required=false) String title,
@RequestParam(value="content",required=false) String content,
@RequestParam(value="usernames",required=false) String usernames){
ModelAndView mv = new ModelAndView();
PageData pd = new PageData();
pd = this.getPageData();
pd.put("title", title);
pd.put("content", content);
String publisher = ((User)this.getRequest().getSession().getAttribute(Const.SESSION_USER)).getNAME();
pd.put("publisher", publisher);
pd.put("username", usernames);
pd.put("pushtime", DateUtil.getTime()); //新增时间
try {
int insertNum = pushService.save(pd);
//插入的条数
Long id = (Long) pd.get("id");//获取id
//创建MQTTserver
PushController server = new PushController();
server.message = new MqttMessage();
server.message.setQos(2);
server.message.setRetained(false);
//添加内容
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
if(title.length() > 10) {
title = title.substring(0,10) +"...";
}
//content去除html标签并缩写
String contstr = "";
contstr = content.replaceAll("<[.[^>]]*>","");
contstr = contstr.replaceAll(" ", "");
if(contstr.length() > 15) {
contstr = contstr.substring(0,15) +"...";
}
//拼接要传入的json字符串
JSONObject jsonObj = new JSONObject();
jsonObj.put("title", title);
jsonObj.put("message", contstr);
jsonObj.put("time", df.format(new Date()));
jsonObj.put("type", 4);
jsonObj.put("Id", id);
//放入mqtt server 转utf-8防止乱码
server.message.setPayload(jsonObj.toString().getBytes("UTF-8"));
String[] names = usernames.split(",");
for(String i:names) {
//设置topic
topic11 = client.getTopic("IM/"+i+"/Inbox");
//推送
server.publish(server.topic11, server.message);
System.out.println(server.message.isRetained() + "------ratained状态");
}
mv.addObject("msg","success");
mv.setViewName("information/push/push_list");
} catch (Exception e) {
e.printStackTrace();
}
return mv;
}
}
推送的内容 按app要求需要放到json格式的字符串中,为了防止乱码 需要用utf8转换一下
topic因为需要设置为动态,所以根据前端提交的name值拼接作为topic名称
mqtt协议实现 java服务端推送功能(三)项目中给多个用户推送功能的更多相关文章
- mqtt协议实现 java服务端推送功能(一)安装
最近有个新需求,需要通过java服务端把信息推送到mqtt服务器上,安卓和ios端从mqtt服务器上获取信息实现推送. 1. 本地需要安装Mosquitto服务器 http://mosquitto. ...
- mqtt协议实现 java服务端推送功能(二)java demo测试
上一篇写了安装mosQuitto和测试,但是用cmd命令很麻烦,有没有一个可视化软件呢? 有,需要在google浏览器下载一个叫MQTTLens的插件 打开MQTTLens后界面如下: 打开conne ...
- Java 服务端监控方案(四. Java 篇)
http://jerrypeng.me/2014/08/08/server-side-java-monitoring-java/ 这个漫长的系列文章今天要迎来最后一篇了,也是真正与 Java 有关的部 ...
- java服务端集成极光消息推送--详细开发步骤
1.极光推送账号准备 要使用极光消息推送必须先在官方网站上注册账号,并添加应用. 产品介绍:https://docs.jiguang.cn/jpush/guideline/intro/ 注册开发者账号 ...
- 那些年,我们见过的 Java 服务端“问题”
导读 明代著名的心学集大成者王阳明先生在<传习录>中有云: 道无精粗,人之所见有精粗.如这一间房,人初进来,只见一个大规模如此.处久,便柱壁之类,一一看得明白.再久,如柱上有些文藻,细细都 ...
- Flex通信-Java服务端通信实例
转自:http://blessht.iteye.com/blog/1132934Flex与Java通信的方式有很多种,比较常用的有以下方式: WebService:一种跨语言的在线服务,只要用特定语言 ...
- JPush简单Java服务端案例实现
一.激光推送准备工作 1.注册极光推送开发者账号,创建应用: 2.完成推送设置,填写应用名提交生成安装包: 3.扫码安装简单的测试apk,查看应用信息会有AppKey和Master Secret用于推 ...
- RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互
本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实现Client和Server C#服务端,Java客户端 其中 ...
- C#使用Thrift简介,C#客户端和Java服务端相互交互
C#使用Thrift简介,C#客户端和Java服务端相互交互 本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实 ...
随机推荐
- quartz 定时器时间表达式
按顺序依次为 秒(~) 分钟(~) 小时(~) 天(月)(~,但是你需要考虑你月的天数) 月(~) 天(星期)(~ =SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) .年份(-) ...
- P1241 括号序列
P1241 括号序列 题解 谁解释下标签递推是个什么鬼,应该是暴力 数据比较小直接跑暴力 但是注意题目描述 也就是说: [ ( ] ) 是不合法的 补全应该是 [ ] ( [ ] ) 举个栗子: 比如 ...
- 前端知识点回顾——Javascript篇(一)
DOM特殊元素获取 document.documentElement //HTML标签 document.head //head标签 document.title //title标签 document ...
- js 时间戳格式化日期格式
时间戳转换为日期,网上搜了好几个或多或少都有点问题,自己整理了一下,写了个方法 console.log(formatDate(1565280000000)) 输出: 2019-08-09 00:00: ...
- win10自定义右键新建文件
新建.reg文件,如添加py文件 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.py\ShellNew] "NullFil ...
- python之crawlscrapy爬取某集团招聘信息以及招聘详情
针对这种招聘信息,使用crawlscrapy很适合. 1.settings.py # -*- coding: utf-8 -*- # Scrapy settings for gosuncn proje ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-4.后端项目分层分包及资源文件处理
笔记 4.后端项目分层分包及资源文件处理 简介:项目基本目录结构,包名称建立,配置文件建立 1.基本目录结构 controller se ...
- unix进程通信方式总结(中)(转)
在上一篇博客http://blog.csdn.net/caoyan_12727/article/details/52049417已经总结了<<uinx环境高级编程>>进程通信前 ...
- 在jsp页面如何获得url参数
方法一:当一个url过来时,如:http://localhost:8080/pro/demo/hello.jsp?name=john,在hello.jsp页面,我们可以这样得到name的值: < ...
- CentOS8 安装 simple-scan 的方法
CentOS8删除了很多软件包,解决的思路一般是从CentOS7或EPEL7的软件仓库中寻找,并解决依赖关系. 比如找到EPEL7中有 simple-scan 软件包,但安装时发现其又依赖 gnome ...