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
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇