Comment by bdangubic

Comment by bdangubic 3 days ago

41 replies

this is exactly why spring succeeded. I need to run a scheduled job, @EnableScheduling then @Scheduled(cron = “xxxxxx”) - done. I need XYZ, @EnableXYZ the @XYZ… sh*t just works…

taftster 3 days ago

And then I realize I need to change that schedule. And would like to do it without recompiling my code. Oh, and I need to allow for environment specific scheduling, weekdays on one system, weekends on others. And I need other dependencies that are environment specific.

I much prefer Spring's XML configuration from the old days. Yeah, XML sucks and all that. But still, with XML, the configuration is completely external from the application and I can manage it from /etc style layouts. Hard coding and compiling in dependency injection via annotations or other such behaviors into the class directly has caused me grief over the long term pretty much every time.

  • sass_muffin 3 days ago

    I do realize you were intending to give examples of why you don't think annotations aren't very extensible, but it is an odd example as all those things can still be achieved via annotation, since the annotations can accept values loaded from env specific properties.

    • le-mark 3 days ago

      Exactly this, it’s great fun to have a surface level understanding of a topic and post derisively for internet points; rather then spend the time and effort to actually learn about the subject at hand!

      • taftster 2 days ago

        I'm not digging for "internet points". Yes, superficial replacement values can be retrieved from the environment. But I guess we have to give you a more imagined or sophisticated example then to make the point to you?

        How about varying implementations of a service interface. Let's say I have a Scheduler interface and I want to have multiple implementations; maybe one is CronScheduler, another is RandomScheduler, another is BlueMoonScheduler. Each of these schedulers have their own properties and configuration values. I might want to choose, per environment or deployment context, which service implementation to use.

        Annotation configuration makes this (near?) impossible to dynamically wire and configure these scenarios and make them tailored to the environment or deployment scenario. Annotations are generally "static" and do not follow a configuration-as-code approach to application deployment.

        An external configuration file, as offered by Spring's original (less "favored") XML style, allowed a more composable and sophisticated configuration-as-code approach. Maybe that's a negative, putting that much power into the hands of the service administrator. But as I stated originally, in my experience, having statically defined annotation driven configuration and/or dependency injection has caused more problems than it has solved.

    • vlovich123 2 days ago

      > env specific properties

      And then if you want to change a value at runtime you have to restart the executable?

      • petersellers 2 days ago

        Most web application servers work this way. It also works really well in practice using modern CD tools - update your configuration and perform a gradual rollout of all your application servers to reflect the updated configuration.

        • bdangubic 2 days ago

          people will argue crazy sht here on HN like changing schedule is a thing* that needs instant gratification and god forbid you have to bounce a service to read an updated configuration … :)

      • happymellon a day ago

        I have to deal with this at work for rolling db credentials, actuator refreshes are fine for this purpose.

        Would be nicer if we could handle creds like it wasn't 1992, but this does the job too.

  • nunobrito 3 days ago

    The only real-world usage I see for annotations are in GSON (the @Expose) and JUnit with @Test.

    Never really came across with any other real cases where it solves a pressing issue as you mention. Most times is far more convenient to do things outside the compiled code.

    • taftster 2 days ago

      Agreed. These are good examples where annotations seem like a good fit. Being able to tell a processor that a method or field is "special". Test methods, serializable hints, etc.

      It's kind of like, when annotations were delivered to Java, lots of projects thought they were just the next greatest thing. I followed right along at the time, as well.

      But over time, finding the value in the configuration-as-code approach to application deployment, I definitely feel that annotations have been abused for many use cases.

  • bdangubic 3 days ago

    all trivial things you are listing, every single one…

  • paulddraper 3 days ago

    So…pass that variable to your annotation.

    I’m not seeing the point?

vbezhenar 3 days ago

Yeah, it works until it isn't. And they good luck debugging it. I'd prefer simple obvious linear code calling some functions over this declarative magic any day.

    cronService.schedule("xxx", this::refresh);
This isn't any harder than annotation. But you can ctrl+click on schedule implementation and below easily. You can put breakpoint and whatnot.
  • bdangubic 3 days ago

    never had any issues debugging as I am never debugging the scheduler (that works :) ) but my own code.

    and what exactly is “cronService”? you write in each service or copy/paste each time you need it?

    • vbezhenar 2 days ago

      `cronService` is an injected instance of some class, probably provided by framework. My point is to demonstrate alternative, imperative way of defining cron tasks, as compared to declarative one.

      • vips7L 2 days ago

        A better name would probably be CronScheduler or something else. “Service” is always overused and doesn’t actually describe or mean anything.

    • alex_smart 3 days ago

      You can write your own libraries?

      My goodness. What a question!

      • throwaway7783 3 days ago

        Whole point of spring is so you don't have to write your own libraries. Batteries included and all.

      • bdangubic 3 days ago

        you write your own database driver? encryption?

skeletal88 3 days ago

Then you need to deploy it on multiple nodes and neex to make sure it only runs once for each run of the cron, etc.

  • didntcheck 2 days ago

    I believe Quartz is the go-to solution for this. It's not part of Spring but it offers a similar annotation-driven interface, but with distributed locking via a database

    • bdangubic 2 days ago

      Absolutely! But Quartz is also quite heavy. If all you need is to ensure scheduled jobs run in a clustered environment there are more “lighweight” options

  • bdangubic 3 days ago

    while not working on out of the box clustered this is trivial issue to address