RecoverIncomingMessageskicks in and grabs it also? But I'll be damned to hell if I can figure out where that's happening.
MessageLogger.MessageSucceeded()which is hard coded to report the "loopback://retries/" URL (which is called ReplyUri??), no matter what. The other logging I added seems to indicate it's actually coming from "loopback://durable/"
JasperOptions.ScheduledJobs.PollingTime, which seems to control the durability agent's queue processing. I set them both to 2 minutes (default of 0 seconds and 5 seconds respectively), and the problem seems to go away.
.StoreAndForward()initially saves the message as an incoming message with an
OwnerIdof 0 (= AnyNode), and then immediately throws it into it's
WorkerQueue, which will start running the handler regardless of the "owning node". Then, since the
RecoverIncomingMessagesfires every 5 seconds by default, assuming the handler takes longer than 5 seconds to run, it will see the message sitting in the incoming messages table, and "recover it" and run it again.