In a high-availability setup that has more than one processing server, timer events can be picked up by multiple engines. When that happens, all but one of them will fail to acquire the lock and will throw an ActivitiOptimisticLockingException.
This was previously reported in ACT-966. That issue was closed as "Not a Bug" since the locking behavior correctly makes sure that only one engine actually processes the timer.
However, as is noted in the comment of that ticket, the Activiti engine still logs a SEVERE level message for these expected situations. This is still an actual bug. The Activiti code should only log SEVERE level errors for things that have actually gone wrong. As it stands today, an high-availability system with a lot of timers will fill its logs with spurious SEVERE messages. As an example, our system is currently generating 10+ MB of these messages every day. This means that we are forced to either:
Ignore the SEVERE messages and disable any application alerting based on them.
Turn off logging completely in the AquireJobsRunable class to quiet these errors. But that will mean that any other (real) errors will also be hidden.
To resolve this, any situations under which the application is working as desired should never log at the SEVERE level. Those should be at most WARN level messages (or better yet, INFO).