quartz 任务错过处理 [来源1] [来源2]
采用StatefulJob,使jobDetails顺序执行,只有前一次job运行完成后,才会运行本次job;
而多个jobDetails可以并行,互不影响,因为它们是多个线程各自运行;
// 设置错失触发后的调度策略
withMisfireHandlingInstructionDoNothing
说人话: 啥也不干 下次按照原频率继续
——不触发立即执行
——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行
withMisfireHandlingInstructionIgnoreMisfires
说人话: 错过的全部同时执行 下次按照原频率继续
——以错过的第一个频率时间立刻开始执行
——重做错过的所有频率周期后
——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行
withMisfireHandlingInstructionFireAndProceed
说人话:立即执行 下次按照原频率继续
——以当前时间为触发频率立刻触发一次执行
——然后按照Cron频率依次执行
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron).withMisfireHandlingInstructionDoNothing());
java读取resource下文件
public void testReadFile() throws IOException {
Resource resource = new ClassPathResource("resource.properties");
InputStream is = resource.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String data = null;
while((data = br.readLine()) != null) {
System.out.println(data);
}
br.close();
isr.close();
is.close();
}
JSONObject,String,Map互相转换
String json = JSON.toJSONString(map);//map转String
JSONObject jsonObject = JSON.parseObject(json);//String转json
//json转map
Map<String, String> jsonMap = JSONObject.toJavaObject(jsonObject, Map.class);
//String转map
Map<String, String> jsonMap1 = JSONObject.parseObject(json, Map.class);
Array、List、Set互转实例 [来源]
Array、List
// Array转List (对s的修改,直接影响list)
String[] s = new String[]{"A", "B", "C", "D","E"};
List<String> list = Arrays.asList(s);
// List转Array (对list中关于元素的修改,不会影响dest)
String[] dest = list.toArray(new String[0]);//new String[0]是指定返回数组的类型
System.out.println("dest: " + Arrays.toString(dest));
List、Set
// 被转换的List(Set)的修改不会对被转化后的Set(List)造成影响
// List转Set
Set<String> set = new HashSet<>(list);
System.out.println("set: " + set);
// Set转List
List<String> list_1 = new ArrayList<>(set);
System.out.println("list_1: " + list_1);
Array、Set
// array转set
s = new String[]{"A", "B", "C", "D","E"};
set = new HashSet<>(Arrays.asList(s));
System.out.println("set: " + set);
// set转array
dest = set.toArray(new String[0]);
System.out.println("dest: " + Arrays.toString(dest));
延伸
上述列出的互相转换离不开Arrays.asList()和Collection.toArray()两个重要的方法;
Arrays.asList()
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
这里出现的ArrayList<>并不是我们通常使用的java.util.ArrayList,因为java.util.ArrayList没有数组作为参数的构造函数。查看对应的源码发现,其实Arrays类的静态内部类。
可以看到,这个由Arrays类实现的另一个Arrays$ArrayList,对于java.util.ArrayList类来讲,是比较简单粗糙的类。
没有扩容机制;
无法在指定位置add(int index, E element),调用该方法会抛异常;
这些不同让这个ArrayList看起来实际上就是一个List-View(视图类型的List)的数组。
Collection.toArray()
List、Set的具体实现类都对Collection.toArray()方法进行了不同程度的重写,可查看源码