All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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