include::../shared-doc/attributes.adoc[]

= inter-app: Communicate Between Two Applications Using EJB and CDI
:author: Pete Muir
:level: Advanced
:technologies: EJB, CDI, JSF

[abstract]
The `inter-app` quickstart shows you how to use a shared API JAR and an EJB to provide inter-application communication between two WAR deployments.

:standalone-server-type: default
:archiveType: war

== What is it?

The `inter-app` quickstart shows you how to easily communicate between two modular deployments to {productNameFull}. Two WARs, with a shared API JAR, are deployed to the application server. EJB is used to provide inter-application communication, with EJB beans aliased to CDI beans, making the inter-application communication transparent to clients of the bean.

CDI only provides intra-application injection within a top level deployment, for example, an EAR, WAR, or JAR. This improves performance of the application server, as to satisfy an injection point all possible candidates have to be scanned / analyzed. If inter-app injection was supported by CDI, performance would scale according to the number of deployments you have (the more deployments in the running system, the slower the deployment). Java EE injection uses unique JNDI names for the wiring, so each injection point is O(1). The approach shown here combines the two approaches such that you limit the name based wiring to one location in your code, and the main consumers of components can use CDI injection to reference these name wired components. For the name approach to work though, you still need to publish instances, and EJB singletons allow you to do that with just one extra annotation.

This example consists of the following Maven projects, each with a shared parent.

[cols="30%,70%",options="headers"]
|===
|Project |Description

| `shared`
a| This project contains the interfaces which define the contract between the beans exposed by the WARs.

* It generates the `{artifactId}-app-shared.jar` archive.
* It is deployed as an EJB JAR module because Eclipse Web Tools Platform can not deploy simple JARs.

| `appA`
a| This project contains the first WAR.

* It generates the `{artifactId}-app-appA.war` archive.
* It exposes an EJB singleton and a simple UI that allows you to read the value set on the bean in `appB`.

| `appB`
a| This project contains the second WAR.

* It generates the `{artifactId}-app-appB.war` archive.
* It exposes an EJB singleton and a simple UI that allows you to read the value set on the bean in `appA`.
|===

// System Requirements
include::../shared-doc/system-requirements.adoc[leveloffset=+1]
// Use of {jbossHomeName}
include::../shared-doc/use-of-jboss-home-name.adoc[leveloffset=+1]
// Start the {productName} Standalone Server
include::../shared-doc/start-the-standalone-server.adoc[leveloffset=+1]

== Build and Deploy the Quickstart
//
// This quickstart deploys multiple artifacts and cannot use the shared doc.
//
. xref:start_the_eap_standalone_server[Start the {productName} server with the standalone default profile] as described above.
. Open a terminal and navigate to the root directory of this quickstart.
. Type this command to build and deploy the archive:
+
[source,options="nowrap"]
----
$ mvn clean install wildfly:deploy
----

. This will deploy `shared/target/{artifactId}-app-shared.jar`, `appA/target/{artifactId}-app-appA.war` and `appB/target/{artifactId}-app-appB.war` to the running instance of the server.

== Access the Application

Access the running application in a browser at the following URLs:

* http://localhost:8080/{artifactId}-appA
* http://localhost:8080/{artifactId}-appB

You are presented with a form that allows you to set the value on the bean in the other application, as well as display of the value on this application's bean. Enter a new value and click *Update and Send!* to update the value on the other application. Do the same on the other application, and hit the button again on the first application. You should see the values shared between the applications.

== Undeploy the Archive

This quickstart undeploys differently than some of the others because of the WAR and JAR interdependencies.

When you are finished testing, follow these steps to undeploy the archives:

. xref:start_the_eap_standalone_server[Start the {productName} server with the standalone default profile] as described above.
. Open a terminal and navigate to the root directory of this quickstart.
. Type the following command to undeploy the `inter-app-appA.war` and `inter-app-appB.war` archives.
+
[source,options="nowrap"]
----
$ mvn wildfly:undeploy -pl appA,appB
----

. Type the following command to undeploy the `inter-app-shared.jar` archive.
+
[source,options="nowrap"]
----
$ mvn wildfly:undeploy -pl shared
----

// Run the Quickstart in Red Hat Developer Studio or Eclipse
include::../shared-doc/run-the-quickstart-in-jboss-developer-studio.adoc[leveloffset=+1]

// Additional Red Hat Developer Studio instructions
This quickstart consists of multiple projects containing interdependencies on each other, so it deploys and runs differently in {JBDSProductName} than the other quickstarts.

. In the *Servers* tab, right-click on the {productName} server and choose *Start*.
. Deploy the projects in one of the following ways.
** `Drag and Drop` mode: Click to multi-select the *{artifactId}-app-shared*, *{artifactId}-app-appA*, and *{artifactId}-app-appB* projects, then drag and drop them on the running {productName} server. This deploys the projects to the server without opening the browser.
** `Batch` mode: In the *Servers* tab, right-click on the server and choose *Add and Remove*. If the *{artifactId}-app-shared*, *{artifactId}-app-appA*, and *{artifactId}-app-appB* projects are the only projects in the list, click *Add All*. Otherwise, use multi-select to select them and click *Add*. Then click *Finish*.
. Right-click on the *{artifactId}-app-appA* project and choose *Run As* –>; *Run on Server*. A browser window appears that accesses the running `appA` application.
. Right-click on the *{artifactId}-app-appB* project and choose *Run As* –>; *Run on Server*. A browser window appears that accesses the running `appB` application.
. To undeploy the *{artifactId}-app-appB* project, right-click on it and choose *Run As* –>; *Maven build*. Enter `wildfly:undeploy` for the *Goals* and click *Run*.
. To undeploy the `{artifactId}-app-appA` project, right-click on it and choose *Run As* –>; *Maven build*. Enter `wildfly:undeploy` for the *Goals* and click *Run*.

// Debug the Application
include::../shared-doc/debug-the-application.adoc[leveloffset=+1]
