0 Replies Latest reply on Mar 13, 2015 10:40 AM by noinfo

    WildFly injects destroyed bean during remote EJB invocation

    noinfo

      Hi,

       

      I have Stateless EJB that uses another @Request scoped bean.

       

      My EJB looks like this:

      @Stateless(name = "HelloService")
      @Remote(Service.class)
      public class HelloService implements Service {
          @Inject
          private TimeService timeService;
          @Override
          public String handleRequest() {
              return "Hello: " + timeService.getTime();
          }
      }
      
      

       

      Declared remote interface:

      public interface Service {
      
          public String handleRequest();
      }
      
      

       

      @RequestScoped bean that has a state:

      @RequestScoped
      public class TimeService {
      
          private boolean disposed;
          private String time;
      
          public String getTime() {
              if (disposed) {
                  throw new RuntimeException("already disposed");
              }
      
              return time;
          }
      
          @PostConstruct
          private void initialize() {
              time = OffsetDateTime.now().toString();
              disposed = false;
              System.out.println("initialized");
          }
      
          @PreDestroy
          private void dispose() {
              disposed = true;
              System.out.println("disposed");
          }
      }
      
      

       

      That is how I am creating proxy for EJB invocation:

      @ApplicationScoped
      public class ServiceProvider {
      
          private final InitialContext context;
      
          public ServiceProvider() throws NamingException, IOException {
              context = new InitialContext();
          }
      
          private <T> T get(String module, String bean, Class<T> contract) throws NamingException {
              final String application = "ServiceEAR";
              final String distinct = "";
      
              final String name = contract.getName();
      
              T service = (T) context.lookup("ejb:" + application + "/" + module + "/" + distinct + "/" + bean + "!" + name);
              return service;
          }
      
          public Service getService() throws NamingException {
              return get("Services", "HelloService", Service.class);
          }
      }
      
      
      
      
      
      
      
      

       

      And using it like this:

      @Named(value = "catcher")
      @SessionScoped
      public class CallerController implements Serializable {
      
          @Inject
          private ServiceProvider provider;
      
          private String value = "";
      
          public String getValue() {
              return value;
          }
      
          public void callService() {
              int i = 0;
              String result = "";
              try {
                  for (; i < 5; i++) {
                      System.out.println("begin call: i = " + i);
                      String response = provider.getService().handleRequest();
                      System.out.println(response);
                      System.out.println("end call");
                      result += response;
                  }
              } catch (Exception ex) {
                  System.out.println(ex.getMessage());
                  System.out.println("end call");
                  result += ex.getMessage();
              }
              this.value = result;
          }
      }
      
      
      
      
      
      

       

      Server log after execution:

      13:56:00,597 INFO  [stdout] (default task-52) begin call: i = 0
      13:56:00,599 INFO  [stdout] (default task-52) initialized
      13:56:00,599 INFO  [stdout] (default task-52) disposed
      13:56:00,599 INFO  [stdout] (default task-52) Hello: 2015-03-12T13:56:00.599+04:00
      13:56:00,599 INFO  [stdout] (default task-52) end call
      13:56:00,599 INFO  [stdout] (default task-52) begin call: i = 1
      13:56:00,919 INFO  [stdout] (default task-52) java.lang.RuntimeException: already disposed
      13:56:00,919 INFO  [stdout] (default task-52) end call
      
      
      

       

      So when I called "handleRequest" method via remote interface in my JSF application two times in a row I got RuntimeException with the message "already disposed".

      Is there something wrong with @Request scoped bean that it is injected twice even after its destruction? Am I missing some configuration files?

       

      My JSF application deployed outside of EJB's EAR on the same application server. Wildfly version is 8.2.0.Final.