1 Reply Latest reply on Sep 19, 2019 8:56 AM by jewellgm

    EJB client calling the same EJB in different servers within a loop

    mleite

      Hello, there...

       

      My scenario is quite simple, but I can not figure out how to make it work.

       

      Recently we have migrated from JBoss 5.1 to Wildfly 11. The situation I am going to explain used to work within JBoss 5.1, but is not working within Wildfly anymore.

       

      I have a list of servers where resides a @Remote EJB and I need to connect to each of these servers and call this EJB. However, I can only see the connection being performed at the first server of the list. All other calls are made to that server, regardless I create new contexts and lookups.

       

      Looks like the InitialContext is being "reused".

       

      Here are some code snippets

       

      public interface RemoteEJB {
           String call();
      }

       

       

      @Stateless
      @Remote
      public class RemoteEJBImpl implements RemoteEJB {
           public String call() {
      
                String hostname = null;
      
                try {
                     hostname = InetAddress.getLocalHost().getHostName();
                } catch (UnknownHostException e) {
                     System.err.println(e.getMessage());
                }
      
               return hostname;
           }
      }

       

      @Stateless
      public class MainLocalEJB {
      
           private static final String REMOTE_EJB = "RemoteEJBImpl!com.test.service.RemoteEJB";
      
           public List executeRemoteBeansInLoop() {
      
                List result = new ArrayList();
      
                String[] remoteAddresses = {"192.168.55.10","192.168.55.20"};
      
                Arrays.stream(remoteAddresses).forEach(remoteAddress -> {
                     result.add(this.lookupRemoteService(remoteAddress, "8080").call());
                });
      
                return result;
           }
      
      
           private RemoteEJB lookupRemoteService(String remoteAddress, String remotePort) {
                
                RemoteEJB bean = null;
                
                try {
      
                     Context cContext = this.getContext(remoteAddress, remotePort);
                     bean = (RemoteEJB) cContext.lookup(this.getJNDIName(REMOTE_EJB));
      
                } catch (Exception e) {
                     e.printStackTrace();
                }
      
                return bean;
           }
      
           private Context getContext(String remoteAddress) throws NamingException {
      
                Properties env = new Properties();
      
                env.put(Context.INITIAL_CONTEXT_FACTORY,"org.wildfly.naming.client.WildFlyInitialContextFactory");
                env.put(Context.PROVIDER_URL, this.getURL(remoteAddress);
      
                return new InitialContext(env);
           }
      
      
           private String getURL(String remoteAddress, String remotePort) {
      
                StringBuilder url = new StringBuilder();
      
                url.append("remote+http://");
                url.append(remoteAddress);
                url.append(":8080");
      
                return url.toString();
           }
      
           private String getJNDIName(String beanName) {
                return this.getJNDINamePrefix() + beanName;
           }
      
           private String getJNDINamePrefix() {
                return "ejb:connectivity-test-remote-ear/connectivity-test-remote/";
           }
      }

       

       

      Could you give me any help with that?

       

      Thanks in advance,

       

      Marcelo