I'm not an ultimate expert on the topic, but I've had very similar requirements in my previous project, and made a thorough research on possible ways to implement synchronization from Active Directory. As far as I know, there is no other solution than the three options you listed above.
I think the third option is the most viable in most of the cases. It's not very difficult to implement the polling logic yourself, but you might be interested in a small java library that already does most of the hard work. It can help you getting started with change tracking in Active Directory very quickly. Check it out here: https://github.com/zagyi/adsync4j
Disclaimer: I'm the author of the library and would love to get some feedback if you end up making use of it.