diff --git a/ejb/ejb-session-beans-client/pom.xml b/ejb/ejb-session-beans-client/pom.xml
new file mode 100644
index 0000000000..b5e107f23a
--- /dev/null
+++ b/ejb/ejb-session-beans-client/pom.xml
@@ -0,0 +1,54 @@
+
+
+ 4.0.0
+
+ com.baeldung.ejb
+ ejb
+ 1.0-SNAPSHOT
+
+ ejb-session-beans-client
+ EJB3 Client Maven
+ EJB3 Client Maven
+
+
+ 4.12
+ 2.19
+
+
+
+
+ org.wildfly
+ wildfly-ejb-client-bom
+ pom
+ import
+
+
+
+ com.baeldung.ejb
+ ejb-session-beans
+ ejb
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.19
+
+
+ **/*EJBSetupTest.java
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ejb/ejb-session-beans-client/src/main/java/com/baeldung/ejb/session/client/EJBStatefulClient.java b/ejb/ejb-session-beans-client/src/main/java/com/baeldung/ejb/session/client/EJBStatefulClient.java
new file mode 100644
index 0000000000..b2f79a2b13
--- /dev/null
+++ b/ejb/ejb-session-beans-client/src/main/java/com/baeldung/ejb/session/client/EJBStatefulClient.java
@@ -0,0 +1,85 @@
+package com.baeldung.ejb.session.client;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import com.baeldung.ejb.stateful.beans.ItemStatefulRemote;
+
+public class EJBStatefulClient {
+
+ public EJBStatefulClient() {
+ }
+
+ private Context context = null;
+
+ public Boolean getEJBRemoteMessage() {
+ EJBStatefulClient ejb = new EJBStatefulClient();
+ Boolean result = true;
+ try {
+ // 1. Obtaining Context
+ ejb.createInitialContext();
+ // 2. Generate JNDI Lookup name and caste
+ ItemStatefulRemote itemStatefulOne = ejb.lookup();
+ ItemStatefulRemote itemStatefulTwo = ejb.lookup();
+
+ itemStatefulOne.addItem("Book");
+ itemStatefulOne.addItem("Pen");
+ itemStatefulOne.addItem("Copy");
+ itemStatefulOne.addItem("Pencil");
+
+ result = itemStatefulOne.getItemList().equals(itemStatefulTwo.getItemList());
+
+ return result;
+ } catch (NamingException e) {
+ e.printStackTrace();
+ return false;
+ } finally {
+ try {
+ ejb.closeContext();
+ } catch (NamingException e) {
+ e.printStackTrace();
+
+ }
+ }
+ }
+
+ public ItemStatefulRemote lookup() throws NamingException {
+
+ // The app name is the EAR name of the deployed EJB without .ear suffix.
+ // Since we haven't deployed the application as a .ear, the app name for
+ // us will be an empty string
+ final String appName = "";
+ final String moduleName = "session-beans";
+ final String distinctName = "";
+ final String beanName = "ItemStatefulRemote";
+ final String viewClassName = ItemStatefulRemote.class.getName() + "?stateful";
+ final String toLookup = String.format("ejb:%s/%s/%s/%s!%s", appName, moduleName, distinctName, beanName,
+ viewClassName);
+ return (ItemStatefulRemote) context.lookup(toLookup);
+ }
+
+ public void createInitialContext() throws NamingException {
+ Properties prop = new Properties();
+ prop.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
+ prop.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
+ prop.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080");
+ prop.put(Context.SECURITY_PRINCIPAL, "testUser");
+ prop.put(Context.SECURITY_CREDENTIALS, "admin1234!");
+ prop.put("jboss.naming.client.ejb.context", false);
+
+ context = new InitialContext(prop);
+ }
+
+ public void closeContext() throws NamingException {
+ if (context != null) {
+ context.close();
+ }
+ }
+
+}
diff --git a/ejb/ejb-session-beans-client/src/main/java/com/baeldung/ejb/session/client/EJBStatelessClient.java b/ejb/ejb-session-beans-client/src/main/java/com/baeldung/ejb/session/client/EJBStatelessClient.java
new file mode 100644
index 0000000000..3d00771a07
--- /dev/null
+++ b/ejb/ejb-session-beans-client/src/main/java/com/baeldung/ejb/session/client/EJBStatelessClient.java
@@ -0,0 +1,88 @@
+package com.baeldung.ejb.session.client;
+
+import java.util.List;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import com.baeldung.ejb.stateless.beans.ItemStatelessRemote;
+
+public class EJBStatelessClient {
+
+ public EJBStatelessClient() {
+ }
+
+ private Context context = null;
+
+ public static void main(String[] arg) {
+ EJBStatelessClient ejb = new EJBStatelessClient();
+ System.out.println(ejb.getEJBRemoteMessage());
+
+ }
+
+ public Boolean getEJBRemoteMessage() {
+ EJBStatelessClient main = new EJBStatelessClient();
+ Boolean result = true;
+ try {
+ // 1. Obtaining Context
+ main.createInitialContext();
+ // 2. Generate JNDI Lookup name and caste
+ ItemStatelessRemote itemStatelessOne = main.lookup();
+ ItemStatelessRemote itemStatelessTwo = main.lookup();
+
+ itemStatelessOne.addItem("Book");
+ itemStatelessOne.addItem("Pen");
+ itemStatelessOne.addItem("Pencil");
+ itemStatelessOne.addItem("Eraser");
+
+ result = itemStatelessOne.getItemList().equals(itemStatelessTwo.getItemList());
+
+ return result;
+ } catch (NamingException e) {
+ e.printStackTrace();
+ return false;
+ } finally {
+ try {
+ main.closeContext();
+ } catch (NamingException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public ItemStatelessRemote lookup() throws NamingException {
+
+ // The app name is the EAR name of the deployed EJB without .ear suffix.
+ // Since we haven't deployed the application as a .ear, the app name for
+ // us will be an empty string
+ final String appName = "";
+ final String moduleName = "session-beans";
+ final String distinctName = "";
+ final String beanName = "ItemStatelessRemote";
+ final String viewClassName = ItemStatelessRemote.class.getName();
+ final String toLookup = String.format("ejb:%s/%s/%s/%s!%s", appName, moduleName, distinctName, beanName, viewClassName);
+
+ return (ItemStatelessRemote) context.lookup(toLookup);
+ }
+
+ public void createInitialContext() throws NamingException {
+ Properties prop = new Properties();
+ prop.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
+ prop.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
+ prop.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080");
+ prop.put(Context.SECURITY_PRINCIPAL, "testUser");
+ prop.put(Context.SECURITY_CREDENTIALS, "admin1234!");
+ prop.put("jboss.naming.client.ejb.context", false);
+
+ context = new InitialContext(prop);
+ }
+
+ public void closeContext() throws NamingException {
+ if (context != null) {
+ context.close();
+ }
+ }
+
+}
diff --git a/ejb/ejb-session-beans-client/src/main/resources/jboss-ejb-client.properties b/ejb/ejb-session-beans-client/src/main/resources/jboss-ejb-client.properties
new file mode 100755
index 0000000000..077cd7583f
--- /dev/null
+++ b/ejb/ejb-session-beans-client/src/main/resources/jboss-ejb-client.properties
@@ -0,0 +1,8 @@
+remote.connections=default
+remote.connection.default.host=127.0.0.1
+remote.connection.default.port=8080
+remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
+remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
+remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=${host.auth:JBOSS-LOCAL-USER}
+remote.connection.default.username=testUser
+remote.connection.default.password=admin1234!
\ No newline at end of file
diff --git a/ejb/ejb-session-beans-client/src/test/java/com/baeldung/ejb/session/client/test/EJBStatefulClientTest.java b/ejb/ejb-session-beans-client/src/test/java/com/baeldung/ejb/session/client/test/EJBStatefulClientTest.java
new file mode 100644
index 0000000000..670dacc7aa
--- /dev/null
+++ b/ejb/ejb-session-beans-client/src/test/java/com/baeldung/ejb/session/client/test/EJBStatefulClientTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.ejb.session.client.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import com.baeldung.ejb.session.client.EJBStatefulClient;
+
+public class EJBStatefulClientTest {
+
+ @Test
+ public void EJBClientTest() {
+ EJBStatefulClient ejbStatefulClient = new EJBStatefulClient();
+ assertFalse(ejbStatefulClient.getEJBRemoteMessage());
+ }
+
+}
diff --git a/ejb/ejb-session-beans-client/src/test/java/com/baeldung/ejb/session/client/test/EJBStatelessClientTest.java b/ejb/ejb-session-beans-client/src/test/java/com/baeldung/ejb/session/client/test/EJBStatelessClientTest.java
new file mode 100644
index 0000000000..90e3106130
--- /dev/null
+++ b/ejb/ejb-session-beans-client/src/test/java/com/baeldung/ejb/session/client/test/EJBStatelessClientTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.ejb.session.client.test;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import com.baeldung.ejb.session.client.EJBStatelessClient;
+
+public class EJBStatelessClientTest {
+
+ @Test
+ public void EJBClientTest() {
+ EJBStatelessClient ejbStatelessClient = new EJBStatelessClient();
+ assertTrue(ejbStatelessClient.getEJBRemoteMessage());
+ }
+
+}
diff --git a/ejb/ejb-session-beans/pom.xml b/ejb/ejb-session-beans/pom.xml
new file mode 100644
index 0000000000..c1b908c0aa
--- /dev/null
+++ b/ejb/ejb-session-beans/pom.xml
@@ -0,0 +1,95 @@
+
+
+ 4.0.0
+
+
+ com.baeldung.ejb
+ ejb
+ 1.0-SNAPSHOT
+
+
+ ejb-session-beans
+ ejb
+
+
+
+ javax
+ javaee-api
+ ${javaee-api.version}
+ provided
+
+
+
+
+
+
+
+ wildfly-standalone
+
+ true
+
+
+
+
+ org.codehaus.cargo
+ cargo-maven2-plugin
+ ${cargo-maven2-plugin.version}
+
+
+
+
+ wildfly10x
+
+ http://download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final.zip
+
+
+
+
+
+ 127.0.0.1
+ 9990
+ testUser:admin1234!
+
+
+
+
+
+
+
+
+
+
+
+ wildfly-runtime
+
+ false
+
+
+
+
+ org.wildfly.plugins
+ wildfly-maven-plugin
+ 1.1.0.Alpha5
+
+ 127.0.0.1
+ 9990
+ testUser
+ admin1234!
+ ${build.finalName}.jar
+
+
+
+
+
+
+
+
+
+ 7.0
+ 1.6.1
+
+
+
+
+
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/beans/ItemStateful.java b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/beans/ItemStateful.java
new file mode 100644
index 0000000000..faab0bd4b1
--- /dev/null
+++ b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/beans/ItemStateful.java
@@ -0,0 +1,27 @@
+package com.baeldung.ejb.stateful.beans;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.Stateful;
+
+@Stateful(name = "ItemStatefulRemote")
+public class ItemStateful implements ItemStatefulRemote {
+
+ private List itemList;
+
+ public ItemStateful() {
+ itemList = new ArrayList();
+ }
+
+ @Override
+ public void addItem(String itemName) {
+ itemList.add(itemName);
+ }
+
+ @Override
+ public List getItemList() {
+ return itemList;
+ }
+
+}
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/beans/ItemStatefulRemote.java b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/beans/ItemStatefulRemote.java
new file mode 100644
index 0000000000..0d5313772d
--- /dev/null
+++ b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/beans/ItemStatefulRemote.java
@@ -0,0 +1,14 @@
+package com.baeldung.ejb.stateful.beans;
+
+import java.util.List;
+
+import javax.ejb.Remote;
+
+@Remote
+public interface ItemStatefulRemote {
+
+ void addItem(String itemName);
+
+ List getItemList();
+
+}
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/beans/ItemStateless.java b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/beans/ItemStateless.java
new file mode 100644
index 0000000000..23d24a5f21
--- /dev/null
+++ b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/beans/ItemStateless.java
@@ -0,0 +1,29 @@
+package com.baeldung.ejb.stateless.beans;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.Stateless;
+
+@Stateless(name = "ItemStatelessRemote")
+public class ItemStateless implements ItemStatelessRemote {
+
+ private List itemList;
+
+ public ItemStateless() {
+ itemList = new ArrayList();
+ }
+
+ @Override
+ public void addItem(String itemName) {
+
+ itemList.add(itemName);
+ }
+
+ @Override
+ public List getItemList() {
+
+ return itemList;
+ }
+
+}
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/beans/ItemStatelessRemote.java b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/beans/ItemStatelessRemote.java
new file mode 100644
index 0000000000..2ed2029cc8
--- /dev/null
+++ b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/beans/ItemStatelessRemote.java
@@ -0,0 +1,13 @@
+package com.baeldung.ejb.stateless.beans;
+
+import java.util.List;
+
+import javax.ejb.Remote;
+
+@Remote
+public interface ItemStatelessRemote {
+
+ void addItem(String itemName);
+
+ List getItemList();
+}
diff --git a/ejb/ejb-session-beans/src/main/resources/META-INF/ejb-jar.xml b/ejb/ejb-session-beans/src/main/resources/META-INF/ejb-jar.xml
new file mode 100755
index 0000000000..7ae4711863
--- /dev/null
+++ b/ejb/ejb-session-beans/src/main/resources/META-INF/ejb-jar.xml
@@ -0,0 +1,6 @@
+
+
+ session-beans
+
\ No newline at end of file
diff --git a/ejb/pom.xml b/ejb/pom.xml
index bfcc972417..c8ffcc4a55 100755
--- a/ejb/pom.xml
+++ b/ejb/pom.xml
@@ -34,7 +34,12 @@
1.0-SNAPSHOT
ejb
-
+
+ com.baeldung.ejb
+ ejb-session-beans
+ 1.0-SNAPSHOT
+ ejb
+
javax
javaee-api
@@ -78,5 +83,7 @@
ejb-remote
ejb-client
+ ejb-session-beans
+ ejb-session-beans-client
\ No newline at end of file