package org.zstack.test.multinodes;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Configurable;
import org.zstack.core.job.Job;
import org.zstack.core.job.JobContext;
import org.zstack.header.core.ReturnValueCompletion;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import org.zstack.utils.path.PathUtil;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
*/
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE)
public class SilentJob implements Job {
private static final CLogger logger = Utils.getLogger(SilentJob.class);
public static String RESULT_FILE = "/tmp/zstacksilentjobresult";
public static String PASS_FOLDER = "/tmp/zstacksilentjobpassfolder";
@JobContext
private String uuid;
private static File resultFile = new File(RESULT_FILE);
static {
try {
resultFile.delete();
if (resultFile.exists()) {
FileUtils.deleteDirectory(resultFile);
}
FileUtils.forceMkdir(resultFile);
} catch (IOException e) {
logger.debug(e.getMessage(), e);
}
}
private void writeResult(String uuid) {
try {
File f = new File(PathUtil.join(resultFile.getAbsolutePath(), uuid));
f.createNewFile();
logger.debug(String.format("create result file: %s", f.getAbsolutePath()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run(final ReturnValueCompletion<Object> completion) {
int timeout = 120;
int count = 0;
while (count < timeout) {
File pass = new File(PathUtil.join(PASS_FOLDER, uuid));
if (pass.exists()) {
logger.debug(String.format("silent job[uuid:%s] is ready to return", uuid));
writeResult(uuid);
completion.success(null);
return;
} else {
logger.debug(String.format("silent job[uuid:%s] is not ready to return", uuid));
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
}