package com.sjy.websocket;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class ScheduleStartListener implements ServletContextListener {
//定时任务销毁时触发
public void contextDestroyed(ServletContextEvent sce) {
}
//定时任务初始化时触发
public void contextInitialized(ServletContextEvent sce) {
try {
recovery();
} catch (Exception e) {
System.out.println("异常1");
}
}
/*
1、创建调度工厂(); 工厂模式
2、根据工厂取得调度器实例(); 工厂模式
3、Builder模式构建子组件<Job,Trigger> builder模式, 如JobBuilder、TriggerBuilder、DateBuilder
4、通过调度器组装子组件 调度器.组装<子组件1,子组件2...> 工厂模式
5、调度器.start(); 工厂模式
*/
public void recovery() throws SchedulerException {
//1 创建调度工厂 并获取工厂实例
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
//2 创建job对象(工作对象)
JobDetail jobDetail = JobBuilder.newJob(ChatServer.class).withIdentity("myJob").build();
//3 创建触发条件并且每2秒执行一次,一直执行
SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever()).build();
//4 启动调度任务
scheduler.start();
//5 添加任务和触发条件
scheduler.scheduleJob(jobDetail,trigger);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>WebSocket</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- quartz监听器 -->
<listener>
<listener-class>com.sjy.websocket.ScheduleStartListener</listener-class>
</listener>
</web-app>
package com.sjy.websocket;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.websocket.CloseReason;
import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.google.gson.Gson;
/**
* @author 石嘉懿
* @Description webSocket服务
* @date 2121-04-20
*/
@ServerEndpoint(value="/chatServer/{userName}")
public class ChatServer implements Job{
private static Gson gson = new Gson();
private static int onlineCount = 0; // 记录连接数目
//ConcurrentHashMap是线程安全的集合容器,特别是在多线程和并发环境中
private static CopyOnWriteArraySet<UserMsg> webSocketSet = new CopyOnWriteArraySet<UserMsg>(); //在线用户
/**
* 连接成功调用的方法
*/
@OnOpen
public void onOpen(@PathParam("userName") String userName, Session session, EndpointConfig config){
// 增加用户数量
addOnlineCount();
// 将当前用户存到在线用户列表中
webSocketSet.add(new UserMsg(session,userName));
System.out.println("用户"+userName+"连接");
}
/**
* 连接关闭方法
*/
@OnClose
public void onClose(Session session,CloseReason closeReason){
// 减少当前用户
subOnlienCount();
}
/**
* 接收客户端的message,判断是否有接收人而选择进行广播还是指定发送
* @param data 客户端发来的消息
*/
@OnMessage
public void onMessage(@PathParam("userName") String userName,String data,Session session){
System.out.println(userName+"收到信息"+data);
//群发消息
for(UserMsg um: webSocketSet){
try {
Session uSession = um.getSession();
if(!uSession.equals(session)){
sendMsg(uSession, new Info(1,userName,data));
}
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
}
/**
* 发生错误
* @param throwable
*/
@OnError
public void onError(Session session,Throwable throwable){
throwable.printStackTrace();
}
public static int getOnlineCount() {
return onlineCount;
}
public synchronized void addOnlineCount(){
onlineCount++;
}
public synchronized void subOnlienCount(){
onlineCount--;
}
public static void sendMsg(Session session,Info info) throws IOException{
session.getBasicRemote().sendText(gson.toJson(info));
}
//定时任务会触发的类
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("你好Quartz");
}
}
最后修改于 2021-04-20 20:55:56
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

