如何同步在JNDI中跨进程放置对象?

时间:2010-05-03 16:59:18

标签: java synchronization jndi

我正在尝试在JNDI中放置一个对象,因此只有一个程序应该能够将它放在JNDI中。有没有可以在J2EE环境中使用的全局锁。 RMI可以用于此目的吗?请提供任何参考链接。提前谢谢。

另外, NameAlreadyBoundexception 是什么?我试图将它用作同步的方法,即只有一个程序将它放在JNDI中,如果其他尝试绑定应该得到该异常。 但是,当我测试多重绑定时,我没有得到Exception.And第二个绑定完成。查找给第二个对象绑定。这是我的代码:

public class TestJNDI {
 private static String JNDI_NAME = "java:comp/env/test/something";

   public static void main(String[] args) throws NamingException {

      Hashtable<String, String> env = new Hashtable<String, String>();
      env.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
      env.put(Context.PROVIDER_URL,"t3://127.0.0.1:7001");

      Context ctx = new InitialContext(env);
      System.out.println("Initial Context created");

      String obj1 = "obj1";
      String obj2 = "obj2";

      try{
          ctx.bind(JNDI_NAME, obj1);
           System.out.println("Bind Sucess");
        }catch(NameAlreadyBoundException ne ){
         // already bound
         System.out.println("Name already bound");
        } 


     ctx.close();

     Context ctx2 = new InitialContext(env);
    try{
      // Second binding to the same name not giving the Exception??
      ctx2.bind(JNDI_NAME, obj2);
      System.out.println("Re Bind Sucess");
      }catch(NameAlreadyBoundException ne ){
     // already bound
     System.out.println("Name already bound");
      } 


    String lookedUp = (String) ctx2.lookup(JNDI_NAME);

    System.out.println("LookedUp Object"+lookedUp);
    ctx2.close();
  }


}

1 个答案:

答案 0 :(得分:0)

当您关闭第一个内容ctx1时,您会释放绑定到它的所有对象,请参阅:Context

所以你的第二个背景与第一个背景无关。