Thank you Reuven for the guidance throughout the development process. I am delighted to contribute my two cents to the Beam project.
Looking forward to more active contributions. *Thanks & Regards* *Rehman Murad Ali* Software Engineer Mobile: +92 3452076766 Skype: rehman.muradali On Thu, Jan 23, 2020 at 11:09 PM Reuven Lax <re...@google.com> wrote: > Thanks to a lot of hard work by Rehman, Beam now supports dynamic timers. > As a reminder, this was discussed on the dev list some time back. > > As background, previously one had to statically declare all timers in your > code. So if you wanted to have two timers, you needed to create two timer > variables and two callbacks - one for each timer. A number of users kept > hitting stumbling blocks where they needed a dynamic set of timers (often > based on the element), which was not supported in Beam. The workarounds > were quite ugly and complicated. > > The new support allows declaring a TimerMap, which is a map of timers. > Each TimerMap is scoped by a family name, so you can create multiple > TimerMaps each with its own callback. The use looks as follows: > > class MyDoFn extends DoFn<...> { > @TimerFamily("timers") > private final TimerSpec timerMap = > TimerSpecs.timerMap(TimeDomain.EVENT_TIME); > > @ProcessElement > public void process(@TimerFamily("timers") TimerMap timers, @Element > Type e) { > timers.set("mainTimer", timestamp); > timers.set("actionType" + e.getActionType(), timestamp); > } > > @OnTimerFamily . > public void onTimer(@TimerId String timerId) { > System.out.println("Timer fired. id: " + timerId); > } > } > > This currently works for the Flink and the Dataflow runners. > > Thank you Rehman for getting this done! Beam users will find it very > valuable. > > Reuven >