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

jadex.micro.taskdistributor.TaskDistributorAgent Maven / Gradle / Ivy

The newest version!
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.micro.annotation.Agent;
import jadex.providedservice.annotation.Service;

@Agent
@Service
public class TaskDistributorAgent implements ITaskDistributor
{
	protected Queue> tasks = new LinkedList>();
	
	protected Queue>> requestors = new LinkedList>>();
	
	protected Map> ongoingtasks = new HashMap>();
	
	protected int cnt;
	
	record TaskFuture(Task task, Future future){}
	
	/**
	 *  Publish a new task.
	 *  @param task The task to publish.
	 */
	@Override
	public IFuture publish(T task)
	{
		Future ret = new Future();
		
		Task mytask = new Task(""+cnt++, task);
		
		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 setTaskResult(String id, R result)
	{
		Future ret = ongoingtasks.get(id);
		if(ret!=null)
		{
			ongoingtasks.remove(id);
			ret.setResult(result);
		}
		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)
	{
		Future ret = ongoingtasks.get(id);
		if(ret!=null)
		{
			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 task = tasks.poll();
			ongoingtasks.put(task.task().id(), task.future());
			ret.setResult(task.task());
		}
		else
		{
			requestors.add(ret);
		}	
		return ret;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy