I had/have the exact same problem, although I think that mine's growing out of it now... I use a combination of things depending on the circumstances.
Reward charts didn't work for us as I don't think that he could grasp the long-term concept/goal.
If I am going to pick a 'fight' with him then I'll stick it out, so I definitely pick my battles. Once I've decided that we're on for it, I always follow the same process and always carry out my threats.
We have a three strike system, XX don't do that, XX if you do that again you're going into the corridor. XX then goes into the corridor (though not very much any more). Once I've calmed down enough to get him out , I go down to his level, get him to say sorry, tell him why he's in there, and then we both have a hug.
This has literally performed miracles in our house, and he's so much better. I would also say that he's def. naughtier with DH who is MUCH more lenient, so I think being firm when necessary really works.
Having said that, there are times (like when he whacks DS2) that the system goes out of the window and he's dragged into the corridor by an arm with the door VERY firmly closed behind him .
Obviously you'd have to be a saint to be calm all the time, but we both now know what happens when he's naughty and I really think it helps both of us.
Hope this helps, good luck!