How to Use Remote EJBs in JBoss Pt. 2

Recap

Remote EJBs make it easy to access business components when they run on a different server. In Part 1, we saw how to create and deploy a Remote EJB.

And now, we’ll access that Remote EJB from a different server.

How Do We Use Remote EJBs?

Our final architecture

  • 1 server running a web app that can access our Remote EJB (Web Tier)
  • 1 server running a Remote EJB (Business Tier)

tier

What You’ll Need

  • A basic understanding of Maven (read this),
  • A basic understanding of EJBs & Servlets (read this)
  • Completion of Part 1 (Business Tier). Steps here

Part 2: The Web Tier

Create Web Application

We’ll use a previous example as our starting point. It contains a web servlet that connects to a Local EJB. And with a few updates, it will connect to our Remote EJB.

  1. Download simple-remoteejb-project
    • Or, follow the steps here
  2. Import the project into JBoss Developer Studio
  3. Add a Maven Dependency: ejb-server-side
    • Under properties, change the type to ejb-client
      Screen Shot 2017-04-17 at 4.20.29 PM
  4. Create JBoss EJB client descriptor
    • In /src/main/webapp/WEB-INF, create a file called jboss-ejb-client.xml
      <jboss-ejb-client xmlns="urn:jboss:ejb-client:1.0">
          <client-context>
              <ejb-receivers>
                  <remoting-ejb-receiver outbound-connection-ref="remote-ejb-connection"/>
              </ejb-receivers>
          </client-context>
      </jboss-ejb-client>
  5. Write EJB client code
    • In SimpleServlet.java, add a method called getRemoteEJB
      public RemoteEJB getRemoteEJB(){
          final Hashtable props = new Hashtable();
          props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
       
          Context context;
          RemoteEJB ejb = null;
       
          try {
              context = new InitialContext(props); 
              ejb = (RemoteEJB) context.lookup("ejb:/ejb-server-side//MyEJB!" + RemoteEJB.class.getName());
      
          } catch (NamingException e) {
              e.printStackTrace();
          }
       
          return ejb;
       }
    • You’ll need to import javax.naming.Context & javax.naming.InitialContext
  6. Remove the Local EJB
    • Delete the lines below and MyEJB.java
      @EJB
      MyEJB ejb;
  7. Declare our Remote EJB
    • At the top of our doGet method, add the following
    •  RemoteEJB ejb = getRemoteEJB();
  8. Update Maven
    • Right click your project -> Maven -> Update Project
  9. Build the project
    • Right click your project -> Run as -> Maven Build.
      Goals: clean install
  10. Find the build artifact
    • Right click your project -> Show In -> System Explorer
    • Under the target folder, there should be a .war file
    • Save the location of this file, we’ll need it soon!

Create Web Tier Server

  1. Duplicate your $JBOSS_HOME directory
    • If you don’t know where that is, see Part 1 under “Add a New User”
    • Once you find it, make a copy of it. Name the new directory jboss-eap-6.4-2.
      • We’ll refer to this directory as $JBOSS_HOME2
  2. Start your server
    • In a terminal, start JBoss (for Windows, standalone.bat)
      $ ./$JBOSS_HOME2/bin/standalone.sh
  3. Start the JBoss CLI (Command Line Interface)
    • In a separate terminal, run the CLI script (for Windows, jboss-cli.bat)
      $ ./$JBOSS_HOME2/bin/jboss-cli.sh --connect
  4. Create a security realm
    • Add a new security realm called ejb-security-realm
      /core-service=management/security-realm=ejb-security-realm:add()
    • Add your secret key from Part 1
      /core-service=management/security-realm=ejb-security-realm/server-identity=secret:add(value="<your_secret_key>")
  5. Create an outbound socket binding
    /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-socket-ejb:add(host=localhost, port=4447)
  6. Create a remote outbound connection
    • Add an outbound connection with our socket, security realm, and username (from Part 1)
      /subsystem=remoting/remote-outbound-connection=remote-ejb-connection:add(outbound-socket-binding-ref=remote-socket-ejb,security-realm=ejb-security-realm,username=ejbuser)
    • Configure security settings
      /subsystem=remoting/remote-outbound-connection=remote-ejb-connection/property=SASL_POLICY_NOANONYMOUS:add(value=false)
      
      /subsystem=remoting/remote-outbound-connection=remote-ejb-connection/property=SSL_ENABLED:add(value=false)
  7. Shutdown your server
    • In the CLI, type shutdown

Connect to Our Remote EJB

  1. Start Server 1 – Business Tier
    • In a terminal, navigate to your $JBOSS_HOME/bin
      $ ./standalone.sh -Djboss.node.name=server1
  2. Start Server 2 – Web Tier
    • In a separate terminal, navigate to your $JBOSS_HOME2/bin
      $ ./standalone.sh -Djboss.node.name=server2 -Djboss.socket.binding.port-offset=100
  3. Delete old deployments
    • Delete everything in $JBOSS_HOME2/standalone/deployments
  4.  Deploy our Web Application
    • Copy the simple-remoteejb.war file (from earlier) to $JBOSS_HOME2/standalone/deployments
    • You should see a .deployed file created
  5. Connect to our remote EJB
    • Navigate to your web server
      http://localhost:8180/simple-ejb-project/SimpleEJB
      Hello World!

Great! Let’s review what we just did.

Create Web Application

  • We added our Remote EJB (ejb-server-side) as a dependency, since we reference it in our servlet
  • We created a EJB client descriptor to configure settings for a Remote EJB connection
    • In the next section, we actually create the connection using the CLI
  • We wrote client code to lookup our remote EJB
    • InitialContext – an environment we’ll use to connect to our EJB
      • URL_PKG_PREFIXES & org.jboss.ejb.client.naming – tells the environment to use our descriptor file to create our remote connection
    • Once we connect to our remote server, we need to lookup our EJB
      • JNDI (Java Naming Directory Interface)  allows us to lookup Java objects
      • Syntax to lookup an EJB. Read more here
        ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>

Create Web Tier Server

  • We created a second server to host our web application
  • We used the CLI to add a remote outbound connection to our business tier server
    • The CLI (Command Line Interface) is an easy way to modify your JBoss server
    • In JBoss, port 4447 is used for remote EJB calls
  • Remote outbound connections include
    • Remote socket – the hostname & port of our remote server.
    • Username – our credentials from Part 1
    • Security Realm – our secret key for authentication

Connect to Our Remote EJB

  • We started our business tier server that is running our Remote EJB
  • We started out web server and deployed our web application
    • Since we’re running two servers on one machine, we had to start the web server with a port-offset.
    • Otherwise, both servers will try to use the same ports & crash
    • Port offsets shift all server ports a certain amount
  • We connected to our web app and it called our remote EJB

So..

  1. We use an EJB client descriptor to configure a remote connection
  2. We wrote client code to lookup our EJB by name (JNDI)
  3. We used the CLI to create a remote connection on our server

Source Code & Useful Links

  1. Project Source Code
  2. EJB Invocations from a remote server
  3. The JBoss CLI

Ok, that’s all for now!

Happy Coding,

-T.O.

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a website or blog at WordPress.com

Up ↑

%d bloggers like this: