接着上一篇说,上一篇的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. 在AndroidStudio中使用单元测试

    1. 前言     在Android开发中,如果对一个简单的功能,每次修改代码都重新运行到设备中进行测试,会浪费大量时间,降低开发工作效率.如果使用单元测试,编写单元测试类,执行测试单元测试类就可以对 ...

  2. LC 725. Split Linked List in Parts

    Given a (singly) linked list with head node root, write a function to split the linked list into k c ...

  3. 怎么用php实现短信验证码发送

    我在在众多的第三方短信服务商里选择了云片网这个短信服务商,我也会尽可能利用最简单的方式去帮助广大开发者解决短信验证码功能模块的实现. 再次之前我也参考了大部分网上的博客等,大多数都是把云片网的demo ...

  4. Djang之ModelForm组件的简单使用

    ModelForm组件的简单使用 models.py from django.db import models class UserInfo(models.Model): username = mod ...

  5. 导入现有java工程

    1)错误:点击File-->open File 这样只能导入单个文件: 2)正确:File-->Import--> 然后下一步下一步即可.

  6. springboot-多环境测试

    1.application.properties中添加spring.profiles.active=test 2.同级目录下创建application-dev.properties.applicati ...

  7. mgo连接池

    package main import ( "log" "sync" "time" "gopkg.in/mgo.v2" ...

  8. Python3 Selenium自动化web测试 ==> 第六节 WebDriver高级应用 -- 操作web页面的滚动条

    学习目的: 掌握页面元素定位以外的其他重要知识点. 正式步骤: 测试Python3代码 # -*- coding:utf-8 -*- from selenium import webdriver fr ...

  9. mybatis resultMap 子元素

    resultMap constructor - 类在实例化时,用来注入结果到构造方法中 idArg - ID 参数;标记结果作为 ID 可以帮助提高整体效能 arg - 注入到构造方法的一个普通结果 ...

  10. 【AMAD】django-cities -- 为Django项目提供国家,城市数据

    动机 简介 个人评分 动机 有时候看一些数据库设计,国家数据会存在一个单独的表里面.这种方式读取数据库无疑又要加上一层join,很不划算. 简介 [django-cities]1可用为你提供国家和城市 ...