ejb 2.1 jboss
由于“功能培训”继续前进,而我们又没有保持软件堆栈的最新状态,因此我们的团队发现自己处于不得不迁移的不利位置:
- JBoss 4.2.3到AS 7.1.x(当前为7.1.1)
- EJB 2.1到EJB 3.1
- Hibernate2到Hibernate3或4
以快速的方式。 我的意思是,谁想要发布具有8-10年历史的软件的新版本,而不是我! 以下是我在研究从具有EJB 2.1的JBoss 4.2.3升级到具有EJB 3.1的AS 7.1.x时所做的一些研究的结果。 我相信还会有更多
与不久的将来的迁移相关的帖子,但这与JNDI命名区域的更改有关。
过去/当前
在我们当前的代码中,JNDI的命名非常简单:
- 我们在部署描述符中将“ ejb /”与远程会话Bean接口的名称连接起来,以指示服务应绑定的名称。
- 在代码中,我们使用以下代码来处理JNDI查找。 真正令人高兴的部分是,远程客户端可以在容器内的服务器上以及服务器上使用相同的代码。
当前代码
Hashtable properties = new Hashtable();
properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
properties.put("java.naming.provider.url", "jnp://localhost:1099");
Context ctx = new InitialContext(properties);
Object ref = ctx.lookup(jndiName);
AS7和EJB 3.1
EJB 3.1规范进行了一些更改,以强制要求EJB的可移植JNDI名称,您可以在AS 7.1.1中继承它。 我发现的另一件棘手的事情是,我无法再使用来自远程客户端和服务器的完全相同的查找代码。
现在,AS 7具有两个用于远程EJB调用的选项 。 您需要的信息可以在JBoss文档中找到,但并没有打动我! 经过几天的努力,我决定创建一个小程序,以帮助(希望)使差异非常清楚。 下面是我创建用来从远程客户端调用无状态会话Bean的程序。 我从7.1快速入门示例中部署了“ ejb-remote”示例。 该代码尝试使用两种远程方法加载远程服务。 可以预期的是,对于第一组查找,第一次查找成功,而第二次使用“ ejb:/”命名格式失败。 然后,将值为“ org.jboss.ejb.client.naming”的Context.URL_PKG_PREFIXES属性添加到传递给InitialContext构造函数的jndi属性中,并重复查找。 现在,两个查找都应该成功。 我已将所有JNDI属性包含在代码中,而不是依赖从类路径中获取的“ jboss-ejb-client.properties ”或“ jndi.properties ”的副本。
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;
public class EJBClient {
private static String[] JNDINAME = {
"jboss-as-ejb-remote-app/CalculatorBean!org.jboss.as.quickstarts.ejb.remote.stateless.RemoteCalculator",
"ejb:/jboss-as-ejb-remote-app/CalculatorBean!org.jboss.as.quickstarts.ejb.remote.stateless.RemoteCalculator"
};
private Hashtable jndiProps;
public EJBClient() {
// setup 'base' jndi properties - no jboss-ejb-client.properties being picked up from classpath!
jndiProps = new Hashtable();
jndiProps.put("java.naming.factory.initial",
"org.jboss.naming.remote.client.InitialContextFactory");
jndiProps.put(InitialContext.PROVIDER_URL, "remote://localhost:4447");
jndiProps.put("jboss.naming.client.ejb.context", true);
// needed for remote access - remember to run add-user.bat
jndiProps.put(Context.SECURITY_PRINCIPAL, "client");
jndiProps.put(Context.SECURITY_CREDENTIALS, "password");
}
public void doLookups() {
// the 'exported' namespace
for (int i = 0; i < JNDINAME.length; i++) {
lookup(JNDINAME[i]);
}
// This is an important property to set if you want to do EJB invocations via the remote-naming project
jndiProps.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
// now with the ejb
for (int i = 0; i < JNDINAME.length; i++) {
lookup(JNDINAME[i]);
}
}
private void lookup(String name) {
System.out.println("Lookup name="+name);
Context ctx = null;
try {
ctx = new InitialContext(jndiProps);
Object ref = ctx.lookup(name);
System.out.println("...Successful");
} catch (NamingException e) {
System.out.println("...Failed");
//System.out.println(e.getMessage());
e.printStackTrace();
} finally {
if (ctx != null) {
try {
ctx.close();
} catch (NamingException e) {}
}
}
}
public static void main(String[] args) throws Exception {
EJBClient client = new EJBClient();
client.doLookups();
System.out.println("Done!");
}
}
服务器端的AS7
现在,在服务器上进行JNDI查找的简单部分与旧方法非常相似,不同之处在于,您仍然需要根据新规范格式化JNDI名称,并且命名工厂不再是jnp版本!
Hashtable jndiProps = new Hashtable();
jndiProps.put("java.naming.factory.initial", "org.jboss.as.naming.InitialContextFactory");
ctx = new InitialContext(jndiProps);
Object ref = ctx.lookup(jndiName);
结论
就像我之前说的那样,该信息已经在JBoss文档中,但是我可能读了几次。 我要寻找的是一个示例,该示例显示了从客户端和服务器加载EJB。
希望这可以帮助!
翻译自: https://www.javacodegeeks.com/2013/05/jboss-as7-jndi-ejb-3-1-naming-changes.html
ejb 2.1 jboss