![JAR search and dependency download from the Maven repository](/logo.png)
jadex.micro.taskdistributor.IntermediateTaskDistributorAgent Maven / Gradle / Ivy
package jadex.micro.taskdistributor;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import jadex.future.Future;
import jadex.future.IFuture;
import jadex.future.ISubscriptionIntermediateFuture;
import jadex.future.SubscriptionIntermediateFuture;
import jadex.micro.annotation.Agent;
import jadex.micro.taskdistributor.ITaskDistributor.Task;
import jadex.providedservice.annotation.Service;
@Agent
@Service
public class IntermediateTaskDistributorAgent implements IIntermediateTaskDistributor
{
protected Queue> tasks = new LinkedList>();
protected Queue>> requestors = new LinkedList>>();
protected Map> ongoingtasks = new HashMap>();
protected int cnt;
record TaskFuture(Task task, SubscriptionIntermediateFuture future){}
/**
* Publish a new task.
* @param task The task to publish.
*/
@Override
public ISubscriptionIntermediateFuture publish(T task)
{
SubscriptionIntermediateFuture ret = new SubscriptionIntermediateFuture();
Task mytask = new Task(""+cnt++, task);
//System.out.println("published task: "+mytask.id());
if(!requestors.isEmpty())
{
ongoingtasks.put(mytask.id(), ret);
requestors.poll().setResult(mytask);
}
else
{
tasks.add(new TaskFuture(mytask, ret));
}
return ret;
}
/**
* Set the result of a task.
* @param id The task id.
* @param result The result.
*/
public IFuture addTaskResult(String id, R result)
{
//System.out.println("adding result: "+id);
SubscriptionIntermediateFuture ret = ongoingtasks.get(id);
if(ret!=null)
ret.addIntermediateResult(result);
else
System.out.println("Task not found: "+id);
return IFuture.DONE;
}
/**
* Set a task finished.
* @param id The task id.
* @param result The result.
*/
public IFuture setTaskFinished(String id)
{
SubscriptionIntermediateFuture ret = ongoingtasks.get(id);
if(ret!=null)
{
//System.out.println("removing tf: "+id);
ongoingtasks.remove(id);
ret.setFinished();
}
else
{
System.out.println("Task not found: "+id);
}
return IFuture.DONE;
}
/**
* Set the exception of a task.
* @param id The task id.
* @param ex The exception.
*/
public IFuture setTaskException(String id, Exception ex)
{
SubscriptionIntermediateFuture ret = ongoingtasks.get(id);
if(ret!=null)
{
//System.out.println("removing ex: "+id+" "+ex);
ongoingtasks.remove(id);
ret.setException(ex);
}
else
{
System.out.println("Task not found: "+id);
}
return IFuture.DONE;
}
/**
* Request a task.
* @return The next task (waits for a task).
*/
public IFuture> requestNextTask()
{
Future> ret = new Future>();
if(!tasks.isEmpty())
{
TaskFuture tf = tasks.poll();
ongoingtasks.put(tf.task().id(), tf.future());
ret.setResult(tf.task);
}
else
{
requestors.add(ret);
}
return ret;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy