Как получить SessionContext в JBOSS

Я пробовал несколько способов в сессионном компоненте, например:

@Resource
private SessionContext ctx;

ИЛИ ЖЕ

private SessionContext ctx;

@Resource
private void setSessionContext(SessionContext ctx) {
  this.sctx = ctx;
}

ИЛИ ЖЕ

InitialContext ic = new InitialContext();
SessionContext ctx = (SessionContext) ic.lookup("java:comp/env/sessionContext");

Ни одна из них не сработала, в JBOSS произошли разные исключения.

Я действительно злюсь на это. Любой может сказать мне, что не так. Большое спасибо!

3 ответа

Решение

Два первых решения (полевая инъекция и метод установки метода) выглядят хорошо и должны работать.

У меня есть сомнения по поводу третьего (подход поиска), так как вы не показали соответствующий @Resource(name="sessionContext") аннотации, но она должна работать, если правильно использовать.

Четвертый вариант будет искать стандартное имя java:comp/EJBContext

@Stateless
public class HelloBean implements com.foo.ejb.HelloRemote {
  public void hello() {
    try {
      InitialContext ic = new InitialContext();
      SessionContext sctxLookup = 
          (SessionContext) ic.lookup("java:comp/EJBContext");
      System.out.println("look up EJBContext by standard name: " + sctxLookup);
    } catch (NamingException ex) {
      throw new IllegalStateException(ex);
    }
  }
}

Все эти четыре подхода совместимы с EJB 3 и должны определенно работать с любым сервером приложений Java EE 5, как указано в 4 путях получения EJBContext в EJB 3. Пожалуйста, предоставьте полную трассировку стека исключения, которое вы получите, если они этого не делают.

Вы можете перечислить эти привязки, используя следующий код, он покажет вам, что доступно в контексте. (При этом используется Groovy-код для выполнения итерации (каждой) над перечислением)

Context initCtx = new InitialContext();
Context context = initCtx.lookup("java:comp") as Context
context.listBindings("").each {
   println it
}

В зависимости от того, запускается ли этот код в контексте ejb или в веб-контексте, вы можете увидеть другой вывод.

Вы можете получить SessionContext следующим образом:

      package com.ejb3.tutorial.stateless.client;

import javax.naming.Context;
import javax.naming.InitialContext;


import com.ejb3.tutorial.stateless.clientutility.JNDILookupClass;
import com.ejb3.tutorial.stateless.bean.EmployeeBean;
import com.ejb3.tutorial.stateless.bean.EmployeeServiceRemote;

public class Main {
    public static void main(String[] a) throws Exception {

        EmployeeServiceRemote service = null;
        Context context = JNDILookupClass.getInitialContext();
        String lookupName = getLookupName();
        service = (EmployeeServiceRemote) context.lookup(lookupName);
        service.addBid("userId",1L,0.1);
      }
    
     private static String getLookupName() {
            /*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 */
            String appName = "SessionContextInjectionEAR";
     
            /* The module name is the JAR name of the deployed EJB without the 
            .jar suffix.*/
            String moduleName = "SessionContextInjection";
     
            /* AS7 allows each deployment to have an (optional) distinct name. 
            This can be an empty string if distinct name is not specified.*/
            String distinctName = "";
     
            // The EJB bean implementation class name
            String beanName = EmployeeBean.class.getSimpleName();
     
            // Fully qualified remote interface name
            final String interfaceName = EmployeeServiceRemote.class.getName();
     
            // Create a look up string name
            String name = "ejb:" + appName + "/" + moduleName + "/" + 
                    distinctName    + "/" + beanName + "!" + interfaceName +"?stateless";
            System.out.println("lookupname"+name);
            return name;
        }
}

Мой JNDILookupClass выглядит следующим образом:

открытый класс JNDILookupClass { частный статический контекст initialContext; private static final String INITIAL_CONTEXT_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory"; private static final String PKG_INTERFACES ="org.jboss.ejb.client.naming"; частная статическая конечная строка PROVIDER_URL = "http-remoting://127.0.0.1:8080";

          public static Context getInitialContext() throws NamingException {
        if (initialContext == null) {
            Properties clientProperties = new Properties();
            clientProperties.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
            clientProperties.put(Context.URL_PKG_PREFIXES, PKG_INTERFACES);
            clientProperties.put(Context.PROVIDER_URL, PROVIDER_URL);
            clientProperties.put("jboss.naming.client.ejb.context", true);
            initialContext = new InitialContext(clientProperties);
        }
        return initialContext;
    }

}

Мой jboss-ejb-client.properties выглядит следующим образом:

          endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.password=admin123
remote.connection.default.host=localhost
remote.connection.default.port=8080
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.default.username=adminUser

Мой Ejb-бин выглядит следующим образом:

      package com.ejb3.tutorial.stateless.bean;

import java.util.Date;

import javax.annotation.Resource;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;

/**
 * Session Bean implementation class EmployeeBean
 */
@Stateless
@Local({EmployeeServiceLocal.class})
@Remote({EmployeeServiceRemote.class})
public class EmployeeBean implements EmployeeServiceLocal, EmployeeServiceRemote {

    @Resource
    private SessionContext ctx;
    
    public EmployeeBean() {
    }

    public Long addBid(String userId, Long itemId, Double bidPrice) {
        System.out.println("Bid for " + itemId + " received with price" + bidPrice);
        
        TimerService timerService = ctx.getTimerService();
        Timer timer = timerService.createTimer(new Date(new Date().getTime()), "Hello World");
        return 0L;
    }
    
    @Timeout
    public void handleTimeout(Timer timer) {
      System.out.println(" handleTimeout called.");
      System.out.println("---------------------");
      System.out.println("* Received Timer event: " + timer.getInfo());
      System.out.println("---------------------");

      timer.cancel();
    }

}

Мой интерфейс Ejb выглядит следующим образом:

      package com.ejb3.tutorial.stateless.bean;

import javax.ejb.Remote;

@Remote
public interface EmployeeServiceRemote {
    public Long addBid(String userId,Long itemId,Double bidPrice);
}


    
   
Другие вопросы по тегам