Svet,
I couldn't reproduce this. I wrote the following test, which passed:
@Test
public void testNonTransientTaskNotGced() throws Exception {
Task<String> task = TaskBuilder.<String>builder()
.body(Callables.returning("abc"))
.tag(BrooklynTaskTags.tagForContextEntity(app))
.tag(BrooklynTaskTags.NON_TRANSIENT_TASK_TAG)
.build();
Entities.submit(app, task);
task.get();
((LocalManagementContext)mgmt).getGarbageCollector().gcIteration();
Set<Task<?>> alltasks = app.getExecutionContext().getTasks();
assertTrue(alltasks.contains(task));
}
Could your task be not top-level perhaps? If the parent task is
transient, then the parent can be GC'ed, which will cause all its
children to be GC'ed even if they are non-transient.
Or could there be a lot of other tasks (it will by default only keep a
max number of tasks per entity/tag, but it should delete the oldest
tasks first).
Aled
p.s. the relevant code is
`BrooklynGarbageCollector.shouldDeleteTaskImmediately`, which checks for
the presence of the tag `ManagementContextInternal.NON_TRANSIENT_TASK_TAG`.
On 16/03/2015 11:46, Svetoslav Neykov wrote:
How do I create a top level task for an entity which remains after the current
task completes?
I have code running in a poller which starts a task in certain conditions. I
want the task to remain in the task list of the entity, but it is GCed after
the ScheduledTaskcompletes and I see no way to prevent it.
I am starting the task as follows because I want it as a top-level task,
instead of as a child of the current one.
TaskBuilder.builder()
.tag(BrooklynTaskTags.tagForContextEntity(entity))
.tag(BrooklynTaskTags.NON_TRANSIENT_TASK_TAG)
Entities.submit(entity, updateService);
Svet.