| = EJB Refs |
| :index-group: EJB |
| :jbake-date: 2018-12-05 |
| :jbake-type: page |
| :jbake-status: published |
| |
| |
| TomEE complains it doesn't know the container type, so I added |
| type="javax.naming.InitialContext" and it worked (mostly). ## |
| Referencing a bean in another jar (with annotations) |
| |
| When using annotations to reference a bean from another ejb in your ear |
| you have to supplement the `@EJB` reference with a small chunk of xml in |
| the ejb-jar.xml of the referring bean. |
| |
| So in ejb app A colorsApp.jar you have this bean: |
| |
| [source,java] |
| ---- |
| package com.foo.colors; |
| |
| import javax.ejb.Stateless; |
| |
| @Stateless |
| public class OrangeBean implements OrangeRemote { |
| } |
| ---- |
| |
| Then in ejb app B shapesApp.jar you have this bean with a reference to |
| OrangeRemote: |
| |
| [source,java] |
| ---- |
| package com.foo.shapes; |
| |
| import javax.ejb.Stateless; |
| import com.foo.colors.OrangeRemote; |
| |
| @Stateless |
| public class SquareBean implements SquareRemote { |
| @EJB OrangeRemote orangeRemote; |
| } |
| ---- |
| |
| To hook this reference up you need to override this ref and add more |
| info in the ejb-jar.xml of shapesApp.jar as follows: |
| |
| [source,xml] |
| ---- |
| <ejb-jar> |
| <enterprise-beans> |
| |
| <session> |
| <ejb-name>SquareBean</ejb-name> |
| <ejb-ref> |
| <ejb-ref-name>com.foo.shapes.SquareBean/orangeRemote</ejb-ref-name> |
| <ejb-link>colorsApp.jar#OrangeBean</ejb-link> |
| </ejb-ref> |
| </session> |
| |
| </enterprise-beans> |
| </ejb-jar> |
| ---- |
| |
| == Referencing a bean in another jar (xml only, no annotations) |
| |
| The same basic approach applies and dependency injection is still |
| possible, however more information must be described in the xml. |
| |
| In ejb app A colorsApp.jar you have this bean: |
| |
| [source,java] |
| ---- |
| package com.foo.colors; |
| |
| import javax.ejb.Stateless; |
| |
| @Stateless |
| public class OrangeBean implements OrangeRemote { |
| } |
| ---- |
| |
| Then in ejb app B shapesApp.jar -- note there is no `@EJB` annotation: |
| |
| [source,java] |
| ---- |
| package com.foo.shapes; |
| |
| import javax.ejb.Stateless; |
| import com.foo.colors.OrangeRemote; |
| |
| @Stateless |
| public class SquareBean implements SquareRemote { |
| OrangeRemote orangeRemote; |
| } |
| ---- |
| |
| Here's how you would hook this reference up, injection and all, with |
| just xml. The following would be added to the ejb-jar.xml of |
| shapesApp.jar: |
| |
| [source,xml] |
| ---- |
| <ejb-jar> |
| <enterprise-beans> |
| |
| <session> |
| <ejb-name>SquareBean</ejb-name> |
| <ejb-ref> |
| <ejb-ref-name>com.foo.shapes.SquareBean/orangeRemote</ejb-ref-name> |
| <ejb-ref-type>Session</ejb-ref-type> |
| <remote>com.foo.colors.OrangeRemote</remote> |
| <ejb-link>colorsApp.jar#OrangeBean</ejb-link> |
| <injection-target> |
| <injection-target-class>com.foo.shapes.SquareBean</injection-target-class> |
| <injection-target-name>orangeRemote</injection-target-name> |
| </injection-target> |
| </ejb-ref> |
| </session> |
| |
| </enterprise-beans> |
| </ejb-jar> |
| ---- |
| |
| Note that the value of could actually be anything and the above example |
| would still work as there is no annotation that needs to match the and |
| no one will likely be looking up the EJB as it's injected. |
| |
| == Referencing a bean in another server |
| |
| As of OpenEJB 4.0.0-beta-3, server to server references work. |
| |
| First we need to configure and name the InitialContext that will be used |
| to satisfy the lookup to the other server. |
| |
| In this example we are calling our InitialContext `shoe` for fun. |
| |
| [source,xml] |
| ---- |
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| <openejb> |
| |
| <JndiProvider id="shoe" type="javax.naming.InitialContext"> |
| java.naming.provider.url = ejbd://localhost:4201 |
| java.naming.factory.initial = org.apache.openejb.client.RemoteInitialContextFactory |
| </JndiProvider> |
| |
| </openejb> |
| ---- |
| |
| Declaring the `@EJB` reference is then done using a `mappedName` that |
| references the named `InitialContext` |
| |
| [source,java] |
| ---- |
| public class BlueBean implements BlueRemote { |
| |
| @EJB(mappedName = "jndi:ext://shoe/OrangeBeanRemote") |
| private OrangeRemote orangeRemote; |
| |
| public void hasOrangeRemote() { |
| Assert.assertNotNull("orangeRemote is null", orangeRemote); |
| assertEquals("olleh", orangeRemote.echo("hello")); |
| } |
| } |
| ---- |
| |
| Specifically, the `mappedName` syntax is as follows: |
| |
| * jndi:ext://`<contextId>`/`<jndiName>` |
| |
| === Referencing a bean in "many" servers |
| |
| Note the above also works with the various forms of failover that TomEE |
| supports. |
| |
| If say, there are two servers that have the `OrangeBeanRemote` bean, you |
| could expand the `<JndiProvider>` delcaration like so: |
| |
| [source,xml] |
| ---- |
| <JndiProvider id="shoe" type="javax.naming.InitialContext"> |
| java.naming.provider.url = failover:ejbd://192.168.1.20:4201,ejbd://192.168.1.30:4201 |
| java.naming.factory.initial = org.apache.openejb.client.RemoteInitialContextFactory |
| </JndiProvider> |
| ---- |
| |
| In the event that the `ejbd://192.168.1.20:4201` server cannot be |
| contacted, the second server will be tried. |
| |
| This sort of arangement can also happen dynamicall against a list of |
| servers that continuously grows and shrinks. The server list is |
| maintained behind the scenes using server discovery logic that can |
| function on either UDP or TCP. See these docs for more details on |
| Failover and Discovery: |
| |
| * link:multicast-discovery.html[Multicast Discovery (UDP)] |
| * link:multipulse-discovery.html[Multipulse Discovery (TCP)] |
| * link:multipoint-discovery.html[Multipoint Discovery (TCP)] |