0 Replies Latest reply on May 11, 2017 2:46 AM by vrushank.desai

    Dynamically invoke remote EJB3 method using reflection

    vrushank.desai

      Our current application has a requirement to route all remote EJB calls used for batch jobs through an MDB to facilitate retries. As a result, I need to invoke the remote EJB through reflection.

       

      When looking up the remote EJB3 interface, the returned value from the ctx.lookup(envProperties) call is actually a proxy object and not the real one which is expected. Thus, when looking up the method using clazz.getMethod(..) throws a NoSuchMethodException.

       

      Below is my code.

       

      The Remote Interface:

       

      package my.interface.package;
      
      import java.io.Serializable;
      import java.util.Date;
      import java.util.List;
      
      public interface MyServiceBeanRemoteInterface extends Serializable {
         public List<Long> callBatchJob(Date batchDate, long batchId, boolean flag);
      }
      

       

      Lookup code:

      final Properties env = new Properties();
      env.put("java.naming.factory.url.pkgs","org.jboss.ejb.client.naming");
      env.put("remote.connections","default");
      env.put("endpoint.name","client-endpoint");
      env.put("remote.connection.default.host","localhost");
      env.put("remote.connection.default.port","4447");
      env.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED","false");
      env.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS","false");
      env.put("remote.connection.default.username","testuser");
      env.put("remote.connection.default.password","testpassword");
      
      Context ctx = new InitialContext(env);
      Object lookup = ctx.lookup( "ejb:myapp/business/MyServiceBean!my.interface.package.MyServiceBeanRemoteInterface");
      Class<? extends Object> clazz = lookup.getClass();
      
      /* Fails at below line */
      Method method = clazz.getMethod("callBatchJob", Date.class, Long.class, Boolean.class);
      Object returnValue = method.invoke(lookup, new Date(), Long.valueOf(6), true);
      

       

      How do I work around this? The implementation class can vary.