Github user ahgittin commented on the issue:
https://github.com/apache/brooklyn-server/pull/816
Think I've addressed everything except `getImmediately(unsubmittedTask)`.
> My expectation for what getImmediately(task) should do is: try to
evaluate the task immediately, but if it couldn't then leave the task in a good
state so if someone else does task.get() then it will still be usable.
I think the only way to support your expected behaviour is to run it in a
separate thread. And this defeats the point of most uses which is to be
lightweight and throw away the task afterward.
So I think the best thing to do is clarify the semantics in javadoc that
unsubmitted tasks will be cancelled (and clean up the tests a bit -- though
more would always be welcome -- and add the `isExecutingImmediately` guard you
noted), with a note that callers should use the `TaskFactory` pattern if that
behaviour is not desired (because the `TaskAdaptable` will cause it to create a
new task instance).
While a `getImmediatelyOrSubmitIfWeCant` would be nice, it is problematic.
We often won't know if a task doesn't support immediate until we've tried
running it, and it does a `wait` or similar, and throws. If we don't want it
to throw, then we can't neatly enforce that it doesn't block (without polling
the other threads state or maybe via low level hacks). So I think you probably
end up doing `submit(task).get(SHORT_TIMEOUT)`.
There might be room for a
`Tasks.getImmediatelyIfSafeElseSubmitAndShortWait()` utility method that does a
subset of the checks (including if it's being given a `TaskFactory`) and tries
to avoid unnecessary submits but doesn't risk cancelling an externally supplied
task. I'll review usages and see.
Thoughts @aledsage ?
---