主頁 > 後端開發 > spring boot整合quartz存盤到資料庫

spring boot整合quartz存盤到資料庫

2020-10-19 06:41:02 後端開發

首先是pom.xml依賴

 1  <!-- MQTT依賴 -->
 2         <dependency>
 3             <groupId>org.eclipse.paho</groupId>
 4             <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
 5             <version>1.0.2</version>
 6         </dependency>
 7         
 8              <!--quartz依賴-->
 9         <dependency>
10             <groupId>org.springframework.boot</groupId>
11             <artifactId>spring-boot-starter-quartz</artifactId>
12         </dependency>

 

就一個controller就可以,剩下的自己去寫存盤資料庫的方法

  1 package com.family.Switch.controller;
  2 
  3 import java.text.SimpleDateFormat;
  4 import java.util.Date;
  5 import java.util.List;
  6 import java.util.concurrent.TimeUnit;
  7 
  8 import org.jboss.logging.Logger;
  9 import org.quartz.CronScheduleBuilder;
 10 import org.quartz.CronTrigger;
 11 import org.quartz.Job;
 12 import org.quartz.JobBuilder;
 13 import org.quartz.JobDetail;
 14 import org.quartz.JobExecutionContext;
 15 import org.quartz.JobExecutionException;
 16 import org.quartz.JobKey;
 17 import org.quartz.Scheduler;
 18 import org.quartz.SchedulerException;
 19 import org.quartz.Trigger;
 20 import org.quartz.TriggerBuilder;
 21 import org.quartz.TriggerKey;
 22 import org.springframework.beans.factory.annotation.Autowired;
 23 //import org.springframework.scheduling.Trigger;
 24 import org.springframework.stereotype.Component;
 25 import org.springframework.web.bind.annotation.RequestMapping;
 26 import org.springframework.web.bind.annotation.RequestMethod;
 27 import org.springframework.web.bind.annotation.RequestParam;
 28 import org.springframework.web.bind.annotation.ResponseBody;
 29 import org.springframework.web.bind.annotation.RestController;
 30 
 31 import com.family.Switch.job.CrawlNewsJob;
 32 import com.family.Switch.model.ScheduledTask;
 33 import com.family.Switch.service.IScheduledTaskService;
 34 import com.family.util.mqtt.ServerMQTT;
 35 
 36 import io.swagger.annotations.Api;
 37 import io.swagger.annotations.ApiImplicitParam;
 38 import io.swagger.annotations.ApiImplicitParams;
 39 import io.swagger.annotations.ApiOperation;
 40  
 41 
 42 @Component
 43 @Api(value = "https://www.cnblogs.com/xiaotangtang/p/手動定時開關",description ="手動定時開關")
 44 @RestController
 45 @RequestMapping(value = "https://www.cnblogs.com/trigger")
 46 public class DynamicTaskController implements Job {
 47 
 48     @Autowired
 49     private ServerMQTT servermqtt;
 50     
 51     @Autowired
 52     private IScheduledTaskService ischeduledtaskservice;
 53     
 54     @Autowired
 55     private Scheduler scheduler;
 56     
 57     public final Logger log = Logger.getLogger(this.getClass());
 58     
 59     //全域變數
 60     //private String cronStr = "0/5 * * * * ?";
 61  
 62     @ApiOperation(value="https://www.cnblogs.com/xiaotangtang/p/添加定時", notes="添加定時")
 63     @RequestMapping(value = "https://www.cnblogs.com/startCronadd", method = RequestMethod.POST)
 64     @ApiImplicitParams({
 65         @ApiImplicitParam(name="cronStr",value="https://www.cnblogs.com/xiaotangtang/p/corn值",dataType="string", paramType = "query"),
 66         @ApiImplicitParam(name="news",value="https://www.cnblogs.com/xiaotangtang/p/傳給傳感器的引數控制開關",dataType="string", paramType = "query"),
 67         @ApiImplicitParam(name="logger",value="https://www.cnblogs.com/xiaotangtang/p/log",dataType="string", paramType = "query"),
 68         @ApiImplicitParam(name="key",value="https://www.cnblogs.com/xiaotangtang/p/唯一的",dataType="string", paramType = "query"),
 69         @ApiImplicitParam(name="group",value="https://www.cnblogs.com/xiaotangtang/p/唯一的",dataType="string", paramType = "query")
 70         })
 71     @ResponseBody
 72     public String addcon(@RequestParam("cronStr") String cronStr,@RequestParam("news") String news,@RequestParam("logger") String logger,@RequestParam("key") String key,@RequestParam("group") String group) {
 73         
 74         
 75         try {
 76             //Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
 77 //            scheduler.start();
 78             // 啟動
 79             if (!scheduler.isShutdown()) {
 80                 
 81                 ScheduledTask scheduledtask=new ScheduledTask();
 82                 
 83                 SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 84                 
 85                 scheduledtask.setCreateTime(df.format(new Date()));
 86                 
 87                 scheduledtask.setTaskKey(key);
 88                 
 89                 scheduledtask.setTaskDesc(group);
 90                 
 91                 scheduledtask.setTaskCron(cronStr);
 92                 
 93                 scheduledtask.setInitStartFlag(1);
 94                 
 95                 int selectcount = ischeduledtaskservice.selectcount(scheduledtask);
 96                 
 97                 if (selectcount>0) {
 98                     log.info("已有資料");
 99                 }else {
100                         scheduler.start();
101                         System.out.println("Quartz Start !");
102                         //具體任務
103                         JobDetail job = JobBuilder.newJob(DynamicTaskController.class).withIdentity(key,group).build();
104 
105                         //觸發器
106                        // SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(60).repeatForever();
107                         Trigger trigger = TriggerBuilder.newTrigger().withIdentity(key,group).startNow().withSchedule(CronScheduleBuilder.cronSchedule(cronStr)).build();
108 
109                         scheduler.scheduleJob(job,trigger);
110                     
111                     
112                     ischeduledtaskservice.insert(scheduledtask);
113                     log.info("添加完畢");
114                 }
115                 
116             }
117             //睡眠
118             TimeUnit.MINUTES.sleep(1);
119             scheduler.shutdown(true);
120             
121             if(scheduler.isShutdown()) {
122                   ScheduledTask scheduledtask=new ScheduledTask();
123                   SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
124                   scheduledtask.setUpdateTime(df.format(new Date()));
125                   scheduledtask.setInitStartFlag(0);
126                   scheduledtask.setTaskCron(cronStr);
127                 int update = ischeduledtaskservice.update(scheduledtask);
128                 if (update>0) {
129                     log.info("狀態修改完成");
130                 }
131             }
132             System.out.println("scheduler shutdown ! ");
133         }catch(Exception e){
134             e.printStackTrace();
135       }
136         
137         
138 //        future = threadPoolTaskScheduler.schedule(new MyRunnable(), new Trigger(){
139 //
140 //
141 //            @Override
142 //            public Date nextExecutionTime(TriggerContext triggerContext) {
143 //                try {
144 //                    servermqtt.mqtt(news, "test");
145 //                } catch (MqttException e) {
146 //                    // TODO Auto-generated catch block
147 //                    e.printStackTrace();
148 //                }
149 //                return new CronTrigger(cronStr).nextExecutionTime(triggerContext);
150 //            }
151 //
152 //    });
153         
154         return "startCronadd";
155     }
156     
157     
158     @ApiOperation(value="https://www.cnblogs.com/xiaotangtang/p/查詢所有定時任務", notes="查詢所有定時任務")
159     @RequestMapping(value = "https://www.cnblogs.com/stopCronselect", method = RequestMethod.GET)
160     public List stopCronselect() {
161        return ischeduledtaskservice.select();
162     }
163     
164     @ApiOperation(value="https://www.cnblogs.com/xiaotangtang/p/更新定時", notes="更新定時")
165     @RequestMapping(value = "https://www.cnblogs.com/updatecron", method = RequestMethod.POST)
166     @ApiImplicitParams({
167         @ApiImplicitParam(name="cronStr",value="https://www.cnblogs.com/xiaotangtang/p/corn值",dataType="string", paramType = "query"),
168         @ApiImplicitParam(name="key",value="https://www.cnblogs.com/xiaotangtang/p/log",dataType="string", paramType = "query"),
169         @ApiImplicitParam(name="group",value="https://www.cnblogs.com/xiaotangtang/p/log",dataType="string", paramType = "query")
170         })
171     @ResponseBody
172     public String updatecron(@RequestParam("cronStr") String cronStr,@RequestParam("key") String key,@RequestParam("group") String group) throws SchedulerException {
173         
174          TriggerKey triggerKey = TriggerKey.triggerKey(key, group);
175          
176          CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
177   
178          CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronStr);
179   
180          trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
181   
182          scheduler.rescheduleJob(triggerKey, trigger);
183          
184          ScheduledTask scheduledtask=new ScheduledTask();
185              SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
186              scheduledtask.setUpdateTime(df.format(new Date()));
187              scheduledtask.setInitStartFlag(1);
188              scheduledtask.setTaskCron(cronStr);
189            int update = ischeduledtaskservice.update(scheduledtask);
190            if (update>0) {
191                 log.info("狀態修改完成");
192             }
193         
194         return "updatecron";
195     }
196     
197     
198 
199 //    @RequestMapping("/startCron")
200 //    public String startCron() {
201 //
202 //       future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("0/5 * * * * ?"));
203 //        
204 //       System.out.println("DynamicTask.startCron()");
205 //
206 //       return "startCron";
207 //
208 //    }
209     
210     @ApiOperation(value="https://www.cnblogs.com/xiaotangtang/p/洗掉定時", notes="洗掉定時")
211     @RequestMapping(value = "https://www.cnblogs.com/deletestopCron", method = RequestMethod.POST)
212     @ApiImplicitParams({
213         @ApiImplicitParam(name="key",value="https://www.cnblogs.com/xiaotangtang/p/log",dataType="string", paramType = "query"),
214         @ApiImplicitParam(name="group",value="https://www.cnblogs.com/xiaotangtang/p/log",dataType="string", paramType = "query")
215         })
216     @ResponseBody
217     public String deletestopCron(@RequestParam("key") String key,@RequestParam("group") String group) throws SchedulerException {
218         JobKey jobKey = JobKey.jobKey(key,group);
219         scheduler.deleteJob(jobKey);
220         ScheduledTask scheduledtask=new ScheduledTask();
221         scheduledtask.setTaskKey(key);
222         int delete = ischeduledtaskservice.delete(scheduledtask);
223         if(scheduler.isShutdown() && delete>0) {
224             log.info("已關閉");
225         }
226         
227        return "deletestopCron";
228     }
229 
230 
231         @Override
232         public void execute(JobExecutionContext context) throws JobExecutionException {
233             System.out.println("111111111111111111111");
234         }
235 
236  
237 
238 //    @ApiOperation(value="https://www.cnblogs.com/xiaotangtang/p/停止", notes="停止")
239 //    @RequestMapping(value = "https://www.cnblogs.com/stopCron", method = RequestMethod.GET)
240 //    public String stopCron() {
241 //       if (future != null) {
242 //           future.cancel(true);
243 //       }
244 //       System.out.println("DynamicTask.stopCron()");
245 //       return "stopCron";
246 //    }
247 
248  
249 
250 //    @RequestMapping("/changeCron10")
251 //
252 //    public String startCron10() {
253 //
254 //       stopCron();// 先停止,在開啟.
255 //
256 //       future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("0/2 * * * * ?"));
257 //
258 //       System.out.println("DynamicTask.startCron10()");
259 //
260 //       return "changeCron10";
261 //
262 //    }
263     
264     
265 
266 //    private class MyRunnable implements Runnable {
267 //
268 //       @Override
269 //
270 //       public void run() {
271 //
272 //           System.out.println("DynamicTask.MyRunnable.run()," + new Date());
273 //
274 //       }
275 //
276 //    }
277 
278  
279 
280 }

 

目前又需求改了,又寫出一版一個介面實作添加和修改的job和資料庫實時同步

  1 package com.family.Switch.controller;
  2 
  3 import java.text.SimpleDateFormat;
  4 import java.util.Date;
  5 import java.util.HashMap;
  6 import java.util.List;
  7 import java.util.Map;
  8 
  9 import org.jboss.logging.Logger;
 10 import org.quartz.CronScheduleBuilder;
 11 import org.quartz.CronTrigger;
 12 import org.quartz.JobBuilder;
 13 import org.quartz.JobDetail;
 14 import org.quartz.JobKey;
 15 import org.quartz.Scheduler;
 16 import org.quartz.SchedulerException;
 17 import org.quartz.Trigger;
 18 import org.quartz.TriggerBuilder;
 19 import org.quartz.TriggerKey;
 20 import org.springframework.beans.factory.annotation.Autowired;
 21 //import org.springframework.scheduling.Trigger;
 22 import org.springframework.web.bind.annotation.CrossOrigin;
 23 import org.springframework.web.bind.annotation.RequestBody;
 24 import org.springframework.web.bind.annotation.RequestMapping;
 25 import org.springframework.web.bind.annotation.RequestMethod;
 26 import org.springframework.web.bind.annotation.RequestParam;
 27 import org.springframework.web.bind.annotation.ResponseBody;
 28 import org.springframework.web.bind.annotation.RestController;
 29 
 30 import com.family.Switch.job.EndNewsJob;
 31 import com.family.Switch.job.StaNewsJob;
 32 import com.family.Switch.model.ScheduledTask;
 33 import com.family.Switch.service.IScheduledTaskService;
 34 import com.family.query.model.GreenhouseDevice;
 35 import com.family.query.service.QueryService;
 36 
 37 import io.swagger.annotations.Api;
 38 import io.swagger.annotations.ApiImplicitParam;
 39 import io.swagger.annotations.ApiImplicitParams;
 40 import io.swagger.annotations.ApiOperation;
 41  
 42 
 43 @CrossOrigin
 44 @Api(value = "https://www.cnblogs.com/xiaotangtang/p/手動定時開關",description ="手動定時開關")
 45 @RestController
 46 @RequestMapping(value = "https://www.cnblogs.com/trigger")
 47 public class DynamicTaskController {
 48 
 49     @Autowired
 50     private IScheduledTaskService ischeduledtaskservice;
 51     
 52     @Autowired
 53     private Scheduler scheduler;
 54     
 55     @Autowired
 56     private QueryService queryservice;
 57     
 58     public final Logger log = Logger.getLogger(this.getClass());
 59  
 60     @ApiOperation(value="https://www.cnblogs.com/xiaotangtang/p/添加定時", notes="添加定時")
 61     @RequestMapping(value = "https://www.cnblogs.com/startCronadd", method = RequestMethod.POST)
 62     @ApiImplicitParams({
 63         @ApiImplicitParam(name="map",value="https://www.cnblogs.com/xiaotangtang/p/corn值",dataType="Map", paramType = "add")
 64         })
 65     @ResponseBody
 66     public Map<String,String> addcon(@RequestBody Map<String,String> map) {
 67         Map<String,String> ds=new HashMap<String, String>();
 68         try {
 69             //Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
 70             // 啟動
 71             if (!scheduler.isShutdown()) {
 72                 
 73                 ScheduledTask scheduledtask=new ScheduledTask();
 74                 
 75                 SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 76                 
 77                 scheduledtask.setCreateTime(df.format(new Date()));
 78                 
 79                 scheduledtask.setTaskKeySta(map.get("taskKeySta"));
 80                 
 81                 scheduledtask.setTaskKeyEnd(map.get("taskKeyEnd"));
 82                 
 83                 scheduledtask.setTaskDescSta(map.get("taskDescSta"));
 84                 
 85                 scheduledtask.setTaskDescEnd(map.get("taskDescEnd"));
 86                 
 87                 scheduledtask.setTaskCronSta(map.get("taskCronSta"));
 88                 
 89                 scheduledtask.setTaskCronEnd(map.get("taskCronEnd"));
 90                 
 91                 scheduledtask.setStaTime(map.get("staTime"));
 92                 
 93                 scheduledtask.setEndTime(map.get("endTime"));
 94                 
 95                 scheduledtask.setInitStartFlag(1);
 96                 
 97                 int selectcount = ischeduledtaskservice.selectcount(scheduledtask);
 98                 
 99                 if (selectcount>0) {
100                     log.info("已有資料---執行修改");
101                      //修改開始
102                      TriggerKey triggerKeysta = TriggerKey.triggerKey(map.get("taskKeySta"), map.get("taskDescSta"));
103                        CronTrigger triggersta = (CronTrigger) scheduler.getTrigger(triggerKeysta);
104                        CronScheduleBuilder scheduleBuildersta = CronScheduleBuilder.cronSchedule(map.get("taskCronSta")).withMisfireHandlingInstructionDoNothing();
105                        triggersta = triggersta.getTriggerBuilder().withIdentity(triggerKeysta).withSchedule(scheduleBuildersta).build();
106                        scheduler.rescheduleJob(triggerKeysta, triggersta);
107                      //修改結束
108                        TriggerKey triggerKeyend = TriggerKey.triggerKey(map.get("taskKeyEnd"), map.get("taskDescEnd"));
109                      CronTrigger triggerend = (CronTrigger) scheduler.getTrigger(triggerKeyend);
110                      //可通過下面來進行設定不立即執行,按照corn運算式來執行 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()).withMisfireHandlingInstructionDoNothing();
111                      CronScheduleBuilder scheduleBuilderend = CronScheduleBuilder.cronSchedule(map.get("taskCronEnd")).withMisfireHandlingInstructionDoNothing();
112                      triggerend = triggerend.getTriggerBuilder().withIdentity(triggerKeyend).withSchedule(scheduleBuilderend).build();
113                      scheduler.rescheduleJob(triggerKeyend, triggerend);
114                        
115                    int update = ischeduledtaskservice.update(scheduledtask);
116                    if (update>0) {
117                        log.info(df.format(new Date()));
118                        log.info("定時修改完成");
119                        ds.put("rtnCode", "1");
120                     ds.put("rtnMsg","修改成功啟動!");
121                        return ds;
122                    }
123                 }else {
124                         scheduler.start();
125                         log.info("Quartz Start !");
126                         //具體開始任務
127                         StaNewsJob.sta=map.get("sta");
128                         StaNewsJob.gatelog=map.get("gatelog");
129                         JobDetail jobsta = JobBuilder.newJob(StaNewsJob.class).withIdentity(map.get("taskKeySta"),map.get("taskDescSta")).build();
130                         //觸發器
131                         // SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(starttime-endtime).withRepeatCount(1).repeatForever();
132                         Trigger triggersta = TriggerBuilder.newTrigger().withIdentity(map.get("taskKeySta"),map.get("taskDescSta")).startNow().withSchedule(CronScheduleBuilder.cronSchedule(map.get("taskCronSta"))).build();
133                         scheduler.scheduleJob(jobsta,triggersta);
134                         
135                         
136                         //具體結束任務
137                         EndNewsJob.end =map.get("end");
138                         EndNewsJob.gatelog = map.get("gatelog");
139                         JobDetail jobend = JobBuilder.newJob(EndNewsJob.class).withIdentity(map.get("taskKeyEnd"),map.get("taskDescEnd")).build();
140                         //觸發器-毫秒
141                         Trigger triggerend = TriggerBuilder.newTrigger().withIdentity(map.get("taskKeyEnd"),map.get("taskDescEnd")).startNow().withSchedule(CronScheduleBuilder.cronSchedule(map.get("taskCronEnd"))).build();
142                         scheduler.scheduleJob(jobend,triggerend);
143                     
144                     
145                     int insert = ischeduledtaskservice.insert(scheduledtask);
146                     if (insert>0) {
147                         
148                         GreenhouseDevice greenhousedevice=new GreenhouseDevice();
149                         greenhousedevice.setUpdateTtime(df.format(new Date()));
150                         greenhousedevice.setModel(map.get("taskKeySta"));
151                         greenhousedevice.setDeviceStatus(1);
152                         queryservice.update(greenhousedevice);
153                         
154                         ds.put("rtnCode", "1");
155                         ds.put("rtnMsg","啟動!");
156                         log.info("添加完畢");
157                         return ds;
158                     }
159                 }
160             }
161             //睡眠
162             //TimeUnit.MINUTES.sleep(1);
163             //Thread.sleep(starttime-endtime+2000);
164             //scheduler.shutdown(true);
165            
166         }catch(Exception e){
167             e.printStackTrace();
168       }
169         ds.put("rtnCode", "0");
170         ds.put("rtnMsg","啟動失敗?");
171         return ds;
172     }
173     
174     
175     @ApiOperation(value="https://www.cnblogs.com/xiaotangtang/p/查詢所有定時任務", notes="查詢所有定時任務")
176     @RequestMapping(value = "https://www.cnblogs.com/stopCronselect", method = RequestMethod.GET)
177     public List<ScheduledTask> stopCronselect() {
178        return ischeduledtaskservice.select();
179     }
180     
181     @ApiOperation(value="https://www.cnblogs.com/xiaotangtang/p/洗掉定時", notes="洗掉定時")
182     @RequestMapping(value = "https://www.cnblogs.com/deletestopCron", method = RequestMethod.POST)
183     @ApiImplicitParams({
184         @ApiImplicitParam(name="map",value="https://www.cnblogs.com/xiaotangtang/p/map",dataType="map", paramType = "delete")
185         })
186     @ResponseBody
187     public Map<String,String> deletestopCron(@RequestBody Map<String,String> map) throws SchedulerException {
188         Map<String,String> ds=new HashMap<String, String>();
189         JobKey jobKeysta = JobKey.jobKey(map.get("taskKeySta"), map.get("taskDescSta"));
190         scheduler.deleteJob(jobKeysta);
191         
192         JobKey jobKeyend = JobKey.jobKey(map.get("taskKeyEnd"),map.get("taskDescEnd"));
193         scheduler.deleteJob(jobKeyend);
194         
195         ScheduledTask scheduledtask=new ScheduledTask();
196         scheduledtask.setTaskKeySta(map.get("taskKeySta"));
197         scheduledtask.setTaskKeyEnd(map.get("taskKeyEnd"));
198         int delete = ischeduledtaskservice.delete(scheduledtask);
199         if(delete>0) {
200             log.info("已關閉!洗掉");
201             ds.put("rtnCode", "1");
202             ds.put("rtnMsg","切換手動成功!");
203             return ds;
204         }
205         ds.put("rtnCode", "0");
206         ds.put("rtnMsg","切換手動失敗?!");
207        return ds;
208     }
209 }

 

下面是job-定時風扇關閉指令

 1 package com.family.Switch.job;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 
 6 import javax.annotation.PostConstruct;
 7 
 8 import org.eclipse.paho.client.mqttv3.MqttException;
 9 import org.jboss.logging.Logger;
10 import org.quartz.Job;
11 import org.quartz.JobExecutionContext;
12 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.stereotype.Component;
14 
15 import com.family.util.mqtt.ServerMQTT;
16 
17 @Component
18 public class EndNewsJob implements Job {
19 
20         private static Logger logger = Logger.getLogger(EndNewsJob.class);
21         
22         public static String gatelog;
23         
24         public static String end;
25         
26         @Autowired
27         private ServerMQTT servermqtt;
28         
29         public static EndNewsJob tokenUtil; 
30         
31         public final Logger log = Logger.getLogger(this.getClass());
32         
33         @PostConstruct
34         public void init() {
35             tokenUtil = this;
36             tokenUtil.servermqtt = this.servermqtt;
37         }
38         
39         @Override
40         public void execute(JobExecutionContext context){
41                 SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
42                 log.info(df.format(new Date()));
43                 
44                 
45                 try {
46                     //MQTT發送關閉指令
47                     tokenUtil.servermqtt.TOPIC=gatelog;
48                     tokenUtil.servermqtt.mqtt(end, gatelog);
49                 } catch (MqttException e) {
50                     // TODO Auto-generated catch block
51                     e.printStackTrace();
52                 }
53         }
54 }

接下來是job--風扇開的指令

 1 package com.family.Switch.job;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 
 6 import javax.annotation.PostConstruct;
 7 
 8 import org.eclipse.paho.client.mqttv3.MqttException;
 9 import org.jboss.logging.Logger;
10 import org.quartz.Job;
11 import org.quartz.JobExecutionContext;
12 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.stereotype.Component;
14 
15 import com.family.util.mqtt.ServerMQTT;
16 
17 @Component
18 public class StaNewsJob implements Job {
19 
20         private static Logger logger = Logger.getLogger(StaNewsJob.class);
21         
22         public static String gatelog;
23         
24         public static String sta;
25         
26         @Autowired
27         private ServerMQTT servermqtt;
28         
29         public static StaNewsJob tokenUtil; 
30         
31         public final Logger log = Logger.getLogger(this.getClass());
32         
33         @PostConstruct
34         public void init() {
35             tokenUtil = this;
36             tokenUtil.servermqtt = this.servermqtt;
37         }
38         
39         @Override
40         public void execute(JobExecutionContext context){
41                 SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
42                 log.info(df.format(new Date()));
43                 
44                 try {
45                     //MQTT發送開
46                     tokenUtil.servermqtt.TOPIC=gatelog;
47                     tokenUtil.servermqtt.mqtt(sta, gatelog);
48                 } catch (MqttException e) {
49                     // TODO Auto-generated catch block
50                     e.printStackTrace();
51                 }
52         }
53 }

 

還有一個MQTT的發送

  1 package com.family.util.mqtt;
  2 
  3 import java.io.UnsupportedEncodingException;
  4 
  5 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
  6 import org.eclipse.paho.client.mqttv3.MqttCallback;
  7 import org.eclipse.paho.client.mqttv3.MqttClient;
  8 import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
  9 import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;
 10 import org.eclipse.paho.client.mqttv3.MqttException;
 11 import org.eclipse.paho.client.mqttv3.MqttMessage;
 12 import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
 13 import org.eclipse.paho.client.mqttv3.MqttTopic;
 14 import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
 15 import org.springframework.stereotype.Component;
 16 import org.springframework.stereotype.Service;
 17 
 18 @Component
 19 public class ServerMQTT {
 20     
 21      //MQTT安裝的服務器地址和埠號
 22     public static final String HOST = "tcp:/ip地址:1883";
 23     //定義一個主題
 24     public static String TOPIC;
 25     //定義MQTT的ID,可以在MQTT服務配置中指定
 26     private static final String clientid = "client-1";
 27     
 28 
 29         
 30         private MqttClient client;
 31         private MqttTopic topic;
 32             //賬號
 33         private String userName = "zhny";
 34             //密碼
 35         private String passWord = "zhny2020";
 36         private MqttMessage message;
 37         /**
 38          * g建構式
 39          */
 40         public ServerMQTT() throws MqttException {
 41             // MemoryPersistence設定clientid的保存形式,默認為以記憶體保存
 42             client = new MqttClient(HOST, clientid, new MemoryPersistence());
 43             
 44             if (null!=TOPIC && !"".equals(TOPIC)) {
 45                 connect();
 46             }
 47             
 48         }
 49         
 50         public void mqtt(String news,String top) throws MqttException  {
 51             ServerMQTT server = new ServerMQTT();
 52             TOPIC=top;
 53             server.message = new MqttMessage();
 54             server.message.setQos(2);
 55             //保留資訊最后一次是否
 56             server.message.setRetained(false);
 57             //編輯訊息
 58             try {
 59                 server.message.setPayload(news.getBytes("GBK"));
 60             } catch (UnsupportedEncodingException e) {
 61                 // TODO Auto-generated catch block
 62                 e.printStackTrace();
 63             }
 64             server.publish(server.topic , server.message);
 65             System.out.println(server.message.isRetained() + "------ratained狀態");
 66         }
 67         
 68         
 69         /**
 70          * l連接服務器
 71          */
 72         private void connect() {
 73                  MqttConnectOptions options = new MqttConnectOptions();
 74                  options.setCleanSession(false);
 75                  options.setUserName(userName);
 76                  options.setPassword(passWord.toCharArray());
 77                  // 設定超時時間
 78                  options.setConnectionTimeout(10);
 79                  // 設定會話心跳時間
 80                  options.setKeepAliveInterval(20);
 81                  try {
 82                      client.setCallback(new MqttCallback() {
 83                          public void connectionLost(Throwable cause) {
 84                              // 連接丟失后,一般在這里面進行重連
 85                              System.out.println("連接斷開……(可以做重連)");
 86                          }
 87                          
 88                          public void deliveryComplete(IMqttDeliveryToken token) {
 89                              System.out.println("deliveryComplete---------" + token.isComplete());
 90                          }
 91                          
 92                          public void messageArrived(String topic, MqttMessage message) throws Exception {
 93                              // subscribe后得到的訊息會執行到這里面
 94                              System.out.println("接收訊息主題:" + topic + "  接收訊息Qos:" + message.getQos() + "接收訊息內容:" + new String(message.getPayload()));
 95                          }
 96                      });
 97                      client.connect(options);
 98 
 99                      topic = client.getTopic(TOPIC);
100                  } catch (Exception e) {
101                      e.printStackTrace();
102                  }
103         }
104 
105         /**
106          * t推送訊息
107          */
108         public void publish(MqttTopic topic , MqttMessage message) throws MqttPersistenceException, MqttException {
109             MqttDeliveryToken token = topic.publish(message);
110             token.waitForCompletion();
111             System.out.println("測驗: " + token.isComplete());
112         }
113 
114 
115     
116 }

 

 

最后附贈一個關于開啟,關閉,添加,恢復可自行添加到自己的代碼里面,這個下面的用不到只用到其中看那些方法能用就自己的方法里面就可以

  1 package com.xlt.xfzb.util;
  2  
  3  
  4 import com.xlt.xfzb.entity.Dingshi;
  5 import org.apache.log4j.Logger;
  6 import org.quartz.*;
  7 import org.quartz.DateBuilder.IntervalUnit;
  8 import org.quartz.impl.matchers.GroupMatcher;
  9 import org.springframework.beans.factory.annotation.Autowired;
 10 import org.springframework.stereotype.Service;
 11  
 12  
 13 import java.util.ArrayList;
 14 import java.util.List;
 15 import java.util.Set;
 16 /**
 17  * @Classname QuartzManager
 18  * @Description TODO
 19  * @Date 2019/12/2 11:04
 20  * @Created by xm
 21  */
 22 @Service
 23 public class QuartzManager {
 24  
 25     public final Logger log = Logger.getLogger(this.getClass());
 26     @Autowired
 27     private Scheduler scheduler;
 28  
 29     /**
 30      * 添加任務
 31      *
 32      * @param
 33      * @throws SchedulerException
 34      */
 35     @SuppressWarnings("unchecked")
 36     public void addJob(Dingshi task) {
 37         try {
 38             // 創建jobDetail實體,系結Job實作類
 39             // 指明job的名稱,所在組的名稱,以及系結job類
 40  
 41             Class<? extends Job> jobClass = (Class<? extends Job>) (Class.forName(task.getBean_name()).newInstance()
 42                     .getClass());
 43             JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(task.getJob_name(), task.getJobGroup())// 任務名稱和組構成任務key
 44                     .build();
 45             // 定義調度觸發規則
 46             // 使用cornTrigger規則
 47             Trigger trigger = TriggerBuilder.newTrigger().withIdentity(task.getJob_name(), task.getJobGroup())// 觸發器key
 48                     .startAt(DateBuilder.futureDate(1, IntervalUnit.SECOND))
 49                     .withSchedule(CronScheduleBuilder.cronSchedule(task.getCron())).startNow().build();
 50             // 把作業和觸發器注冊到任務調度中
 51             scheduler.scheduleJob(jobDetail, trigger);
 52             // 啟動
 53             if (!scheduler.isShutdown()) {
 54                 scheduler.start();
 55             }
 56         } catch (Exception e) {
 57             e.printStackTrace();
 58         }
 59     }
 60  
 61     /**
 62      * 獲取所有計劃中的任務串列
 63      *
 64      * @return
 65      * @throws SchedulerException
 66      */
 67     public List<Dingshi> getAllJob() throws SchedulerException {
 68         GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
 69         Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
 70         List<Dingshi> jobList = new ArrayList<Dingshi>();
 71         for (JobKey jobKey : jobKeys) {
 72             List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
 73             for (Trigger trigger : triggers) {
 74                 Dingshi job = new Dingshi();
 75                 job.setJob_name(jobKey.getName());
 76                 job.setJobGroup(jobKey.getGroup());
 77                 job.setRemark("觸發器:" + trigger.getKey());
 78                 Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
 79                 job.setStatus(triggerState.name());
 80                 if (trigger instanceof CronTrigger) {
 81                     CronTrigger cronTrigger = (CronTrigger) trigger;
 82                     String cronExpression = cronTrigger.getCronExpression();
 83                     job.setCron(cronExpression);
 84                 }
 85                 jobList.add(job);
 86             }
 87         }
 88         return jobList;
 89     }
 90  
 91     /**
 92      * 所有正在運行的job
 93      *
 94      * @return
 95      * @throws SchedulerException
 96      */
 97     public List<Dingshi> getRunningJob() throws SchedulerException {
 98         List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
 99         List<Dingshi> jobList = new ArrayList<Dingshi>(executingJobs.size());
100         for (JobExecutionContext executingJob : executingJobs) {
101             Dingshi job = new Dingshi();
102             JobDetail jobDetail = executingJob.getJobDetail();
103             JobKey jobKey = jobDetail.getKey();
104             Trigger trigger = executingJob.getTrigger();
105             job.setJob_name(jobKey.getName());
106             job.setJobGroup(jobKey.getGroup());
107             job.setRemark("觸發器:" + trigger.getKey());
108             Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
109             job.setStatus(triggerState.name());
110             if (trigger instanceof CronTrigger) {
111                 CronTrigger cronTrigger = (CronTrigger) trigger;
112                 String cronExpression = cronTrigger.getCronExpression();
113                 job.setCron(cronExpression);
114             }
115             jobList.add(job);
116         }
117         return jobList;
118     }
119  
120     /**
121      * 暫停一個job
122      *
123      * @param dingshi
124      * @throws SchedulerException
125      */
126     public void pauseJob(Dingshi dingshi) throws SchedulerException {
127         JobKey jobKey = JobKey.jobKey(dingshi.getJob_name(), dingshi.getJobGroup());
128         scheduler.pauseJob(jobKey);
129     }
130  
131     /**
132      * 恢復一個job
133      *
134      * @param task
135      * @throws SchedulerException
136      */
137     public void resumeJob(Dingshi task) throws SchedulerException {
138         JobKey jobKey = JobKey.jobKey(task.getJob_name(), task.getJobGroup());
139         scheduler.resumeJob(jobKey);
140     }
141  
142     /**
143      * 洗掉一個job
144      *
145      * @param task
146      * @throws SchedulerException
147      */
148     public void deleteJob(Dingshi task) throws SchedulerException {
149         JobKey jobKey = JobKey.jobKey(task.getJob_name(), task.getJobGroup());
150         scheduler.deleteJob(jobKey);
151  
152     }
153  
154     /**
155      * 立即執行job
156      *
157      * @param task
158      * @throws SchedulerException
159      */
160     public void runJobNow(Dingshi task) throws SchedulerException {
161         JobKey jobKey = JobKey.jobKey(task.getJob_name(), task.getJobGroup());
162         scheduler.triggerJob(jobKey);
163     }
164  
165     /**
166      * 更新job時間運算式
167      *
168      * @param task
169      * @throws SchedulerException
170      */
171     public void updateJobCron(Dingshi task) throws SchedulerException {
172  
173         TriggerKey triggerKey = TriggerKey.triggerKey(task.getJob_name(), task.getJobGroup());
174  
175         CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
176  
177         CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(task.getCron());
178  
179         trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
180  
181         scheduler.rescheduleJob(triggerKey, trigger);
182     }
183 }

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/179616.html

標籤:Java

上一篇:mybatis淺度總結

下一篇:3種騷操作,教你查看 Java 位元組碼!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more