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.

Reply via email to