效果如下,浏览器输入URL:

等待一段时间,websocket主动推送

后端打印:

程序结构如下:

QuartzConfig.java

@Configuration
public class QuartzConfig {@Beanpublic JobDetail job(){return JobBuilder.newJob(QuartzJob.class).storeDurably().build();}@Beanpublic Trigger trigger(){CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("*/30 * * * * ?");return TriggerBuilder.newTrigger().forJob(job()).withSchedule(scheduleBuilder).build();}
}

WebSocketConfig.java

@Component
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
}

MyController.java

@Controller
public class MyController {@GetMapping("/")public String test(){return "index";}
}

QuartzJob.java

public class QuartzJob extends QuartzJobBean {@AutowiredGoodsRepository goodsRepository;@AutowiredWebSocket webSocket;@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {String str = "";for(Goods goods : goodsRepository.getGoodsArrayList()){str += goods.toString();}webSocket.onMessage(str);}
}

Goods.java

@Data
public class Goods {Integer id;String name;Integer count;
}

GoodsRepository.java

@Repository
public class GoodsRepository {private static ArrayList<Goods> goodsArrayList = new ArrayList<>();static {Goods goods1 = new Goods();goods1.setId(1);goods1.setName("石油50L");goods1.setCount(100);goodsArrayList.add(goods1);Goods goods2 = new Goods();goods2.setId(1);goods2.setName("石油150L");goods2.setCount(100);goodsArrayList.add(goods2);Goods goods3 = new Goods();goods3.setId(1);goods3.setName("石油250L");goods3.setCount(100);goodsArrayList.add(goods3);Goods goods4 = new Goods();goods4.setId(1);goods4.setName("石油300L");goods4.setCount(100);goodsArrayList.add(goods4);}public ArrayList<Goods> getGoodsArrayList(){return goodsArrayList;}
}

WebSocket.java

@Component
@ServerEndpoint("/websocket")
public class WebSocket {//与某个客户端连接对话,通过此对客户端发送消息private Session session;//存放所有连接的客户端private static ConcurrentLinkedQueue<WebSocket> concurrentLinkedQueue = new ConcurrentLinkedQueue<>();@OnOpenpublic void onOpen(Session session){//默认客户端,没有重名this.session = session;concurrentLinkedQueue.add(this);System.out.println("【webSocket连接成功】当前连接人数为:" + concurrentLinkedQueue.size());}@OnClosepublic void onClose() {Iterator<WebSocket> iterator = concurrentLinkedQueue.iterator();while (iterator.hasNext()){WebSocket next = iterator.next();if(next == this){concurrentLinkedQueue.remove(next);}}}@OnErrorpublic void onError(Session session, Throwable throwable){System.out.println("error:");throwable.printStackTrace();}@OnMessagepublic void onMessage(String message){Iterator<WebSocket> iterator = concurrentLinkedQueue.iterator();while (iterator.hasNext()){WebSocket next = iterator.next();try {next.session.getBasicRemote().sendText(message);}catch (IOException e) {e.printStackTrace();}}}}

DemoApplication.java

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title><script type="text/javascript">let ws = null;window.onload=function(){WebSocketTest();}function WebSocketTest(){if ("WebSocket" in window){alert("浏览器支持 WebSocket!");// 打开一个 web socketws = new WebSocket("ws://127.0.0.1:8080/websocket");ws.onmessage = function (evt){let received_msg = evt.data;alert("接收推送数据:" + received_msg);};ws.onclose = function(){// 关闭 websocketalert("连接已关闭...");};}else{// 浏览器不支持 WebSocketalert("浏览器不支持 WebSocket!");}}</script></head>
<body><h1>推送页面</h1></body>
</html>

源码打包下载地址:

https://github.com/fengfanchen/Java/tree/master/QuartzDemo

Spring Boot笔记-利用Quartz进行定时任务,利用websocket推送到浏览器(界面为thymeleaf)相关推荐

  1. Spring Boot 如何解决多个定时任务阻塞问题?

    大家好,我是不才磊哥~ 最近长文撸多了,有点累,今天来点简单的. 今天这篇文章介绍一下Spring Boot 中 如何开启多线程定时任务? 为什么Spring Boot 定时任务是单线程的? 想要解释 ...

  2. spring boot项目中处理Schedule定时任务

    默认,springboot已经支持了定时任务Schedule模块,所以一般情况已经完全能够满足我们的实际需求,一般来说,没有必要在加入其他类似于:quartz 另外,在这里提一个实际项目中,关于定时任 ...

  3. 在Spring Boot中使用@Scheduled实现定时任务

    2019独角兽企业重金招聘Python工程师标准>>> 在Spring Boot中使用@Scheduled实现定时任务 之前没有使用Spring Boot的Java风格配置的时候,用 ...

  4. Spring/Spring boot正确集成Quartz及解决@Autowired失效问题

    Spring/Spring boot正确集成Quartz及解决@Autowired失效问题 参考文章: (1)Spring/Spring boot正确集成Quartz及解决@Autowired失效问题 ...

  5. Flex通过Blazeds利用Remoteservice与后台java消息推送

    Flex通过Blazeds利用Remoteservice与后台java消息推送 准备工作:Myeclipse中先建立一个Web project工程,然后导入Blazeds的文件,再转换为Flex项目类 ...

  6. Spring Boot笔记

    1.什么是SpringBoot 1.简介 就是一个javaweb的开发框架 以前Spring的配置太多,太麻烦,为了提高开发效率,于是开始提倡"约定大于配置",进而衍生出一些一站式 ...

  7. Spring Boot中使用@Scheduled创建定时任务

    我们在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信.邮件之类的操作,也可能会定时地检查和监控一些标志.参数等. 创建定时任务 在Spring Boot中编写定时 ...

  8. Spring Boot笔记-普通异常错误截取及构造错误页面

    在web开发过程中,数据问题会有异常,会抛到页面上,这样造成用户体验差. 目前这个笔记是使用Spring Boot获取异常,并构造新的界面 程序运行截图如下: 另外一个: 这样的话就达到了页面友好的效 ...

  9. 关于Spring boot中的Quartz配置启动开关问题(启动、停止)

    最近在做一个项目,项目中有多个模块,总体构架为SpringBoot +Quartz+其他(其他的不是重点啦). 问题提出: 项目中会有Quartz做的定时任务模块,至于怎么使用Quartz网上一搜一大 ...

最新文章

  1. 【python练习】基于socket的FTP程序 v1.1.0(支持多用户)
  2. swiper切换按钮位置改变_swiper插件自定义切换箭头按钮
  3. python plt画半对数坐标_特征工程大传:对数变换
  4. 网络拓扑故障诊断讲解总结
  5. 2、matplotlib中的 ax=fig.add_axes([0,0,1,1])详解
  6. ubuntu系统配置双网卡方法
  7. mac 程序员装机必备 一篇齐全
  8. css怎么实现三角形边框,css border实现的三角形图案
  9. 在ASP.NET中获取参数POST和GET方式提交的参数
  10. linux与RMB的关系,Ghost 与 Linux 的兼容性
  11. 计算机恢复桌面,桌面图标打开方式怎么还原_电脑图标打开方式恢复方法-win7之家...
  12. Apereo CAS 5.0.X 配置数据库认证方式
  13. 嵌入式课程设计:socket通信模拟服务器客户端实现文件传送(基于c++语言)
  14. VirtualBOX 虚拟机安装 OS X 10.9 Mavericks 及 Xcode 5,本人X220亲测
  15. 字符串内穿插{}使用
  16. Java项目—健身房管理系统(附源码+文档)
  17. 将GHOST后计算机驱动Standard PC改为ACPI Multiprocessor PC
  18. 中国古代兵器与兵书·铜兵生辉
  19. 校园BBS+校园贴吧 发帖 评论 点赞 回复 用户管理 好友管理 聊天的实现
  20. 虚拟机VMware启动出现 Boot Manager

热门文章

  1. Eclipse New菜单中没有Android Project选项
  2. Ehcache配置文件加载方式
  3. Liferay SSO CAS 集成
  4. 学编程的日子里,很多人因迷茫放弃了编程,那我们应该怎么做呢?
  5. 产品经理有话说!这个报表神器更新了6大功能,绝对亮眼
  6. 升级版的数据透视表!用一工具,做出了HR羡慕的人力数据分析
  7. 基于Nokia S60的游戏开发之一
  8. 聊聊 Python 调用 JS 的几种方式,你都知道吗?
  9. 我同事今天被裁了,但我却涨了1万工资!
  10. 找一个程序员当男朋友是什么样的体验?