ejb 2.1 jboss_JBoss AS7 JNDI和EJB 3.1命名更改

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的命名非常简单:

  1. 我们在部署描述符中将“ ejb /”与远程会话Bean接口的名称连接起来,以指示服务应绑定的名称。
  2. 在代码中,我们使用以下代码来处理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。

希望这可以帮助!

参考: JBoss AS7 JNDI&EJB 3.1Scratching我的编程itch博客上,我们的JCG合作伙伴 Mike Miller的命名更改

翻译自: https://www.javacodegeeks.com/2013/05/jboss-as7-jndi-ejb-3-1-naming-changes.html

ejb 2.1 jboss

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值