Okay, I get the use-case now. What I would suggest (the simplest possible, work from there) is using:
1) A process in activiti, with a non-start event, after the start-event there are different receive-tasks. Each receive-task corresponds to a certain machine that needs to do something, they are connected in the right order you can't to have the job executed (and perhaps have some gateways in between, depending on job state) -> e.g. <receiveTask id="machineAWork" />
.
2) Once the native UI create a new Job, call our API (startProcessByKey("key", nativeJob.getUniqueId()), passing in the job's unique ID as a business-key. You now have a process started for the "job".
3) Your native poller on machine A DOES NOT POLL the native db, rather, it uses runtimeService.createExecutionQuery().activityId("machineAWork").list() and takes one of those processes and executes it. The native job can be looked up by using the businessKey provided in the process.
4) After machine A has executed the process, it calls out API: runtimeService.signal(processInstance.getId()) - signaling the process for which the action has been performed.
5) The process is now up to date with the execution-state of the job. Activiti will move on to the next activity in the process, e.g. "machineBWork".
6) Poller on machine B (exactly the same as on machine a) checks for processes waiting in activity "machineBWork"…
If you require user-intervention, the processes can include UserTasks as well. This approach puts the order and actual execution control in the hands of the process, rather than in the hands of your native DB, which is what you need.