Как получить 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);
}