I hit this problem when were creating the orchestration to periodically poll the outer service. The orchestration was with loop inside.
The problem was I created the message inside this loop. And the instance of this message were not disposed after each cycle.
The orchestration was createdfor running long time without restart. That means that this orchestration was collecting enormous amount those indisposed messages. And all those messages were inside the MessageBox, of course. It was wrong!
After long and very interesting investigation the issue was resolved.
The source of the problem was in the transactional scope where I created the indisposable message. This scope was inside the loop.
It is interesting but a lifespan of the message created inside the transactional scope and themessage created outside the transactional scope is different. The first one is disposed only after closing the orchestration instance. The second one is disposed after last using. (I think so but could not find a hint in the BizTalk information sea.)
After discovering this the fix was simple. I moved the loop inside the transaction scope.