接着上一篇说,上一篇的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服务端推送功能(三)项目中给多个用户推送功能的更多相关文章

  1. mqtt协议实现 java服务端推送功能(一)安装

    最近有个新需求,需要通过java服务端把信息推送到mqtt服务器上,安卓和ios端从mqtt服务器上获取信息实现推送. 1. 本地需要安装Mosquitto服务器  http://mosquitto. ...

  2. mqtt协议实现 java服务端推送功能(二)java demo测试

    上一篇写了安装mosQuitto和测试,但是用cmd命令很麻烦,有没有一个可视化软件呢? 有,需要在google浏览器下载一个叫MQTTLens的插件 打开MQTTLens后界面如下: 打开conne ...

  3. Java 服务端监控方案(四. Java 篇)

    http://jerrypeng.me/2014/08/08/server-side-java-monitoring-java/ 这个漫长的系列文章今天要迎来最后一篇了,也是真正与 Java 有关的部 ...

  4. java服务端集成极光消息推送--详细开发步骤

    1.极光推送账号准备 要使用极光消息推送必须先在官方网站上注册账号,并添加应用. 产品介绍:https://docs.jiguang.cn/jpush/guideline/intro/ 注册开发者账号 ...

  5. 那些年,我们见过的 Java 服务端“问题”

    导读 明代著名的心学集大成者王阳明先生在<传习录>中有云: 道无精粗,人之所见有精粗.如这一间房,人初进来,只见一个大规模如此.处久,便柱壁之类,一一看得明白.再久,如柱上有些文藻,细细都 ...

  6. Flex通信-Java服务端通信实例

    转自:http://blessht.iteye.com/blog/1132934Flex与Java通信的方式有很多种,比较常用的有以下方式: WebService:一种跨语言的在线服务,只要用特定语言 ...

  7. JPush简单Java服务端案例实现

    一.激光推送准备工作 1.注册极光推送开发者账号,创建应用: 2.完成推送设置,填写应用名提交生成安装包: 3.扫码安装简单的测试apk,查看应用信息会有AppKey和Master Secret用于推 ...

  8. RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互

    本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实现Client和Server C#服务端,Java客户端 其中 ...

  9. C#使用Thrift简介,C#客户端和Java服务端相互交互

    C#使用Thrift简介,C#客户端和Java服务端相互交互 本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实 ...

随机推荐

  1. quartz 定时器时间表达式

    按顺序依次为 秒(~) 分钟(~) 小时(~) 天(月)(~,但是你需要考虑你月的天数) 月(~) 天(星期)(~ =SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) .年份(-) ...

  2. P1241 括号序列

    P1241 括号序列 题解 谁解释下标签递推是个什么鬼,应该是暴力 数据比较小直接跑暴力 但是注意题目描述 也就是说: [ ( ] ) 是不合法的 补全应该是 [ ] ( [ ] ) 举个栗子: 比如 ...

  3. 前端知识点回顾——Javascript篇(一)

    DOM特殊元素获取 document.documentElement //HTML标签 document.head //head标签 document.title //title标签 document ...

  4. js 时间戳格式化日期格式

    时间戳转换为日期,网上搜了好几个或多或少都有点问题,自己整理了一下,写了个方法 console.log(formatDate(1565280000000)) 输出: 2019-08-09 00:00: ...

  5. win10自定义右键新建文件

    新建.reg文件,如添加py文件 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.py\ShellNew] "NullFil ...

  6. python之crawlscrapy爬取某集团招聘信息以及招聘详情

    针对这种招聘信息,使用crawlscrapy很适合. 1.settings.py # -*- coding: utf-8 -*- # Scrapy settings for gosuncn proje ...

  7. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-4.后端项目分层分包及资源文件处理

    笔记 4.后端项目分层分包及资源文件处理     简介:项目基本目录结构,包名称建立,配置文件建立 1.基本目录结构                 controller             se ...

  8. unix进程通信方式总结(中)(转)

    在上一篇博客http://blog.csdn.net/caoyan_12727/article/details/52049417已经总结了<<uinx环境高级编程>>进程通信前 ...

  9. 在jsp页面如何获得url参数

    方法一:当一个url过来时,如:http://localhost:8080/pro/demo/hello.jsp?name=john,在hello.jsp页面,我们可以这样得到name的值: < ...

  10. CentOS8 安装 simple-scan 的方法

    CentOS8删除了很多软件包,解决的思路一般是从CentOS7或EPEL7的软件仓库中寻找,并解决依赖关系. 比如找到EPEL7中有 simple-scan 软件包,但安装时发现其又依赖 gnome ...