Search code examples
javajakarta-eejpaejblayer

Local stateless EJBs vs Remote


I'm kind of a newbie in EJBs,but I've been given an EJB tier to improve.
This tier consists of an EJB wich exposes the operations available:

@Stateless(name = "myejb")
public class Facade implements FacadeRemote
{
    @EJB
    private EntityAHomeLocal entityAHome;

    @EJB
    private EntityBHomeLocal entityBHome;

// methods signatures and implementations
}

As you can see this EJB use other local EJBs that manage operations on entities.

@Stateless
public class EntityAHome implements EntityAHomeLocal
{
    @PersistenceContext(name="myUnit")
    private EntityManager manager;


    // methods signatures and implementations
}

I'm having hard time to fully understand the architecture of this tier.

  • Is this kind of architrcture common ?
  • Are local stateless EJB managed throught a pool of instances just like remote stateless EJBs ?
  • Would it still work even if entityAHome and entityBHome were remote EJBs ?

Solution

  • Strictly speaking, the spec only says stateless beans are "typically" pooled (section 4.3.10.2), so the behaviour for local beans is vendor-specific, but in practice I believe all the major vendors do (for example).

    Local and remote interfaces are almost entirely interchangeable, but with extra deployment restrictions (i.e. they must be deployed locally, of course), and some calls to local interfaces use pass-by-reference semantics, whereas remote interfaces always use pass-by-value (link).

    I can't see anything that would stop that code working with remote interfaces, although I think some of the naming is confusing - a session bean (@Stateless) is different from an entity, and in EJB terminology "home" refers to a kind of factory class, which I don't think is your intention here (?). Also, be aware that switching to @Remote can add a performance overhead, as the second link notes.