To be honest, I figured there was a high probability this debate would be inevitable. I kept it deliberately brief in the write up in the hopes that this is a subject pretty much all of the stakeholders are already well aligned on. Nonetheless, I will take this opportunity to more fully share my perspective on this. Perhaps it helps, perhaps it does not.
I have tried very hard to convince users and customers to use EJB for more than fifteen years now. The outcome for me is now firmly established. A small percentage (let's say 5-10%) get convinced and inevitably become ardent advocates. The rest immediately make the decision to choose Spring/Spring Boot instead. For this vast majority, EJB is well understood to be outdated, heavyweight, and bloated. As a result, the practical reality is that Jakarta EE as a whole consistently loses users and customers. If we continue to insist on clutching tightly to EJB, I have no doubt whatsoever that Jakarta EE adoption will never grow enough to sustain a critical mass of stakeholders that will be able to keep investing in it. Continuing the irreparably damaged EJB brand was a mistake in Java EE 5, 6, 7 and 8. It's a mistake I have personally paid a very high price for.
For me, the critical question in EE 12 is how much work can be done to convincingly tell the market they can finally use Jakarta EE without needing to use EJB. I understand the most ardent advocates of Jakarta EE are likely EJB fans (in fact count me in that crowd, I even wrote a book on EJB). I also understand for these users we need a graceful "off ramp" that will take some time and effort including early signals that we need to move on now, education on what the alternative approach is (i.e. the model that has successfully worked for Spring users/customers for years now), migration paths, guides, and tools.
I also think that until now, EJBs are not fully replacable with other Jakarta EE constructs. And thus we shouldn’t try to hide EJBs from developers learning Jakarta EE. In fact, teaching developers about EJBs simplifies things a lot. With just a single @Stateless or @Songleton annotation they get transactions automatically, can easily define timers, concurrency is handled (no state should be in stateless, singletons are syncrhonized).
Yes, it’s possible to rewrite EJBs with other constructs but the resulting code is much more verbose and easy to get wrong - timers in Concurrency require to call a method to trigger them, running a method on startup is more verbose compared to @Startup on a singleton EJB, ApplicationScoped CDI beans are not thread safe unlike Singleton EJBs, @RolesAllowed only works on EJBs and not CDI beans, etc.
Jakarta EE still needs improvements to fully replace EJB. And even then it would be good to have a single CDI annotation to enable all the features of EJB in a CDI bean. Until then, it’s better to teach EJBs and then explain how to use the new concepts in Jakarta EE to avoid EJBs for advanced developers.
Ondro
Hi all,
I completely agree with that. EJBs are not bad per se and should not be abandoned.
Everyone is free to use them or not.
Best regards,
Bernd
Am 28.10.24 um 14:54 schrieb Ralph Soika via jakarta.ee-community:
> Hello,
>
> I became aware of this discussion through the topic "EJB -> CDI migration" and would like to briefly
> share my thoughts about it.
> My fear here is to "ban" EJBs as something outdated, complicated and unnecessary. But is that right?
> I myself run with imixs.org <https://www.imixs.org> a very large Jakarta EE project. And my opinion
> is that you should always implement the DataAccessLayer as also complex ProcessingServices in a
> stateless EJB in order to make use of the transaction capability.
> I do know that you can also use CDI for data access. But is it the same?
>
> For example in my own project (a BPMN workflow engine) the DataAccess Service as also the Engine
> itself is implemented as a stateless EJB.
> A project that is using the library just need to inject the WorkflowEngine. The user does not have
> to think about transactions or EJBs at this moment. The app developer can now extend the engine
> behavior by implementing so called 'Plug-Ins' as simple CDI beans. Such a CDI bean is a kind of
> adapter class that can for example react on specific CDI Events in the processing life-cycle. And of
> course the developer can again inject the DataService form the Workflow Engine to create new data.
>
> The point is that if something goes totally wrong, the default transaction manager takes care about
> the rollback over all layers.
>
> And this all comes for free just because of using the stateless local EJB pattern. For the developer
> there is no need to think about EJBs at all.
>
> I may be wrong here, but I would always advise a developer to implement the data access layer via
> EJBs to keep the rest of the application as lean as possible.
> Therefore, in my opinion, EJBs play an important role. A tutorial should not hide its concepts.
>
> Best regards
>
> Ralph
>
> On 28.10.24 14:21, Reza Rahman via jakarta.ee-community wrote:
>> I think the Tutorial refactoring work could easily be tagged “good first issue” and “help wanted”.
>> We have a shockingly low number of those across EE4J projects.
>> ----------------------------------------------------------------------------------------------------
>> *From:* Kito Mann <kito.mann@xxxxxxxxxxx>
>> *Sent:* Sunday, October 27, 2024 11:50 PM
>> *To:* jakarta.ee-spec@xxxxxxxxxxx <jakarta.ee-spec@xxxxxxxxxxx>; Jakarta EE community discussions
>> <jakarta.ee-community@xxxxxxxxxxx>; jakarta.ee-marketing@xxxxxxxxxxx <jakarta.ee-
>> marketing@xxxxxxxxxxx>; Reza Rahman <reza_rahman@xxxxxxxx>
>> *Cc:* Jakarta EE Ambassadors <jakartaee-ambassadors@xxxxxxxxxxxxxxxx>; juneau001@xxxxxxxxx
>> <juneau001@xxxxxxxxx>; Kito Mann <kito.mann@xxxxxxxxxx>
>> *Subject:* Re: EJB -> CDI migration (was Re: Defining Jakarta EE 12 Scope in Program Plan)
>> I love all three of these ideas:
>>
>> 1. EJB -> CDI Migration Guide
>> 2. New EJB -> CDI Migration talk
>> 3. Updating the Jakarta EE Tutorial to remove EJB when possible
>>
>> (3) is non-trivial since a lot of work needs to be done upgrading/rewriting the examples in
>> general, but that doesn’t mean I can’t at least break that work down into the issue tracker. Also,
>> the intro (which I rewrote) specifically does not mention EJB.
>>
>> I’d like to add another: Writing an OpenRewrite for migrating from EJB->CDI.
>>
>> ___
>>
>> Kito D. Mann <https://kitomann.com> | @kito99@mastodon.social <https://mastodon.social/@kito99>|
>> LinkedIn <https://www.linkedin.com/in/kitomann/>
>> Java Champion | Google Developer Expert Alumni
>> Expert consulting and training: Cloud architecture and modernization, Java/Jakarta EE, Web
>> Components, Angular, Mobile Web
>> Virtua, Inc. | virtua.tech <http://virtua.tech>
>> +1 203-998-0403
>>
>> * Enterprise development, front and back. Listen to Stackd Podcast <http://stackdpodcast.com/>.
>> * Speak at conferences? Check out SpeakerTrax <https://speakertrax.com>.