I notice that a move() method was added, but the methods cancel and sendToDLQ seem to be doing the same thing. Shouldn't they call move?
Also
Please avoid
if (blah) { ... } else { ... }
if (blah) { ... } else { ... }
the code formatting has been corrected and the duplicate code is removed: expire(), move() and sendToDLQ() now all calls the private move() method