[
https://issues.jboss.org/browse/WFLY-3852?page=com.atlassian.jira.plugin....
]
Stuart Douglas commented on WFLY-3852:
--------------------------------------
I'm saying that the current behaviour is silly. If you want no concurrent access +
immediate timeout the spec should require WRITE+AccessTimeout(0), it should not (IMHO)
change the behaviour of a read lock if the timeout is set to zero (the whole point of a
READ lock is that it does allow concurrent access from multiple threads as long as the
WRITE lock is not held).
I am going to find out if this was actually the intention of the expert group, or if the
current version of the spec is just badly worded.
EJB @Schedule interleaves timer calls with @AccessTimeout(0)
------------------------------------------------------------
Key: WFLY-3852
URL:
https://issues.jboss.org/browse/WFLY-3852
Project: WildFly
Issue Type: Feature Request
Components: EJB
Affects Versions: 8.1.0.Final
Environment: Win 7 x64 / i7
Reporter: Tibor Digana
Assignee: David Lloyd
Priority: Critical
Note: The value in @AccessTimeout(value = 0) is not a real timeout. It's a marker
skipping scheduler on concurrent Thread.
Actual:
The scheduled method is annotated with @AccessTimeout(0) and @Lock(READ). Very long calls
interleave concurrently.
Expected:
The calls should not interleave if and only if @AccessTimeout(0) is used. Does not matter
which LockType is used.
According to the Javadoc
"A value of 0 means concurrent access is not permitted."
In other words the timer should give it up on concurrent Thread.
The timer should not wait for read/write lock due to the value in the annotation is not
-1.
In the internal implementation of TomEE server the timer skips scheduling if
Lock.tryLock() returns false in this usecase. This can be Read or Write lock - does not
matter.
Don't be confused with WFLY-3430.
I think the fix in WFLY-3430 should only go with the annotation @AccessTimeout(0) with
whatever LockType. If this annotation is not used then the next call should be concurrent
/ blocked depending on READ / WRITE LockType, respectively.
My code:
@Startup
@Singleton
@Lock(READ)
public class MyTimer {
@Schedule(minute = "*", hour = "*", persistent = false, info =
"My Timer")
@AccessTimeout(0)
public void updateByMinutes() {}
}
--
This message was sent by Atlassian JIRA
(v6.3.1#6329)