/*
* All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
*/
package org.terracotta.quartz.tests;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.quartz.impl.JobDetailImpl;
import org.quartz.impl.triggers.AbstractTrigger;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.quartz.impl.triggers.SimpleTriggerImpl;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class NodeDeathTestClient1 extends ClientBase {
public static final Set<String> run = Collections.synchronizedSet(new HashSet<String>());
private final int listenPort;
public NodeDeathTestClient1(String[] args) {
super(args);
this.listenPort = Integer.parseInt(System.getProperty("listenPort"));
}
@Override
protected void test(Scheduler sched) throws Throwable {
log("Starting listening on " + listenPort);
ServerSocket ss = new ServerSocket(listenPort);
JobDetailImpl jobDetail1 = new JobDetailImpl("testjob1", null, NodeDeathTestCronJob.class);
jobDetail1.setDurability(true);
JobDetailImpl jobDetail2 = new JobDetailImpl("testjob2", null, NodeDeathTestCronJob.class);
jobDetail2.setDurability(true);
AbstractTrigger trigger1 = new CronTriggerImpl("trigger1", "group", "0/10 * * * * ?");
trigger1.setJobName("testjob1");
AbstractTrigger trigger2 = new CronTriggerImpl("trigger2", "group", "0/10 * * * * ?");
trigger2.setJobName("testjob2");
sched.addJob(jobDetail1, false);
sched.addJob(jobDetail2, false);
sched.scheduleJob(trigger1);
sched.scheduleJob(trigger2);
AbstractTrigger simpleTrigger = new SimpleTriggerImpl("simpleJob", "simpleGroup",
SimpleTrigger.REPEAT_INDEFINITELY, 15000);
simpleTrigger.setJobName("simpleJob");
simpleTrigger.setJobGroup("simpleGroup");
JobDetailImpl simpleJob = new JobDetailImpl("simpleJob", "simpleGroup", NodeDeathTestSimpleJob.class);
simpleJob.setDurability(true);
sched.addJob(simpleJob, false);
sched.scheduleJob(simpleTrigger);
Socket socket = ss.accept();
log("Got socket connection");
// let both nodes compete for jobs for a while
Thread.sleep(25000);
log("Closing sockets");
socket.close();
ss.close();
// let the other client die and for this node to be notified
Thread.sleep(15000);
run.clear();
Set<String> expect = new HashSet<String>();
expect.add("testjob1");
expect.add("testjob2");
expect.add("simpleJob");
boolean okay = false;
long end = System.currentTimeMillis() + 60000L;
while (System.currentTimeMillis() < end) {
if (run.equals(expect)) {
okay = true;
break;
}
Thread.sleep(1000L);
}
if (!okay) { throw new AssertionError("run set is: " + run); }
}
private void log(String msg) {
System.err.println("[" + new Date() + "] " + msg);
}
}