Scheduler and Business Logic Separation 📎
Splitting a scheduler:
@Startup
@Singleton
public class Reminder {
@Inject
CoffeeBrewer brewer;
@Schedule(minute = "*/30", hour = "*")
public void remind() {
this.brewer.brew();
}
}
...and the business logic:
@Stateless
public class CoffeeBrewer {
public void brew() {
this.boil();
this.grind();
this.deliver();
this.pay();
}
void boil() {}
void grind() {}
void deliver() { }
void pay() {}
}
...into separate classes (dedicated boundary and control) allows the application server to inject proxies. Proxying comes with following benefits:
- Fine grained transaction management: business logic (CoffeeBrewer) can use declarative transactions as usual
- Monitoring: application server will expose monitoring statistics for both classes
- Interception: individual interceptors can be use on both: the scheduler as well as the business logic
- Less noise: dynamic/flexible Schedulers require additional configuration logic. With scheduler / business logic separation, the business logic class remains unaffected and clean.
- Easier unit testing: there is no scheduling code in the business logic
...and the downside? You have to write one more class...
See you at Java EE Workshops at Munich Airport, Terminal 2 or Virtual Dedicated Workshops / consulting. Is Munich's airport too far? Learn from home: airhacks.io.