package net.johnewart.gearman.embedded; import net.johnewart.gearman.common.Job; import net.johnewart.gearman.common.JobStatus; import net.johnewart.gearman.common.client.AbstractGearmanClient; import net.johnewart.gearman.common.events.GearmanClientEventListener; import net.johnewart.gearman.common.interfaces.EngineClient; import net.johnewart.gearman.common.packets.Packet; import net.johnewart.gearman.constants.JobPriority; import net.johnewart.gearman.engine.exceptions.EnqueueException; import net.johnewart.gearman.exceptions.JobSubmissionException; import net.johnewart.gearman.exceptions.WorkException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; import java.util.HashMap; import java.util.UUID; public class EmbeddedGearmanClient extends AbstractGearmanClient implements EngineClient { private final Logger LOG = LoggerFactory.getLogger(EmbeddedGearmanClient.class); private final EmbeddedGearmanServer server; private final Object activeJobLock; private final HashMap<String, byte[]> results; public EmbeddedGearmanClient(EmbeddedGearmanServer server) { this.server = server; this.activeJobLock = new Object(); this.results = new HashMap<>(); } @Override public String submitFutureJob(String callback, byte[] data, Date whenToRun) throws JobSubmissionException { final long timeToRun = whenToRun.getTime() / 1000; final String uniqueId = UUID.randomUUID().toString(); Job submitted = doJobSubmission(callback, uniqueId, data, JobPriority.NORMAL, true, timeToRun); return submitted.getJobHandle(); } @Override public String submitJobInBackground(String callback, byte[] data) throws JobSubmissionException { return submitJobInBackground(callback, data, JobPriority.NORMAL); } @Override public String submitJobInBackground(String callback, byte[] data, JobPriority priority) throws JobSubmissionException { final String uniqueId = UUID.randomUUID().toString(); Job submitted = doJobSubmission(callback, uniqueId, data, priority, true, 0L); return submitted.getJobHandle(); } @Override public byte[] submitJob(String callback, byte[] data) throws JobSubmissionException { Job job = new Job.Builder() .data(data) .functionName(callback) .build(); try { server.submitJob(job, this); synchronized (activeJobLock) { try { activeJobLock.wait(); } catch (InterruptedException e) { e.printStackTrace(); return null; } } } catch (EnqueueException e) { throw new JobSubmissionException(); } return results.get(job.getJobHandle()); } @Override public byte[] submitJob(String callback, byte[] data, JobPriority priority) throws JobSubmissionException, WorkException { return new byte[0]; //To change body of implemented methods use File | Settings | File Templates. } @Override public JobStatus getStatus(String jobHandle) { // NO-OP return null; } @Override public void registerEventListener(GearmanClientEventListener listener) { // NO-OP } @Override public void shutdown() { //To change body of implemented methods use File | Settings | File Templates. } @Override public Job getCurrentJob() { // NO-OP return null; } @Override public void setCurrentJob(Job job) { // NO-OP } @Override public void sendWorkResults(String jobHandle, byte[] data) { synchronized (activeJobLock) { activeJobLock.notify(); } results.put(jobHandle, data); } @Override public void sendWorkData(String jobHandle, byte[] data) { synchronized (activeJobLock) { activeJobLock.notify(); } results.put(jobHandle, data); } @Override public void sendWorkException(String jobHandle, byte[] exception) { } @Override public void sendWorkFail(String jobHandle) { // NO-OP } @Override public void sendWorkWarning(String jobHandle, byte[] warning) { // NO-OP } @Override public void sendWorkStatus(JobStatus jobStatus) { // NO-OP } @Override public void send(Packet packet) { // NO-OP } private Job doJobSubmission(String callback, String uniqueID, byte[] data, JobPriority priority, boolean isBackground, long timeToRun) throws JobSubmissionException { try { final Job requestedJob = new Job(callback, uniqueID, data, priority, isBackground, timeToRun); return server.submitJob(requestedJob, this); } catch (EnqueueException e) { throw new JobSubmissionException(); } } }