JNDI 학습

6307 단어 .netBlogsun
먼저 JNDI 서비스의 Reference 객체에 대해 살펴보겠습니다.
일반적으로, 우리는 대상을 JNDI 서비스에 등록할 수 있으며, Initial Context의bind와rebind 방법을 호출하면 된다.이 등록된 대상은 '인용된 대상' 이라고 하는데, 메모리에 주둔하는 운행 대상이다.JNDI 서비스의 기능은 이것에만 한정된 것이 아니라 네트워크 프린터와 같은 다양한 자원을 등록할 수 있다.이러한 자원은 메모리에서 찾을 수 있는 실행 대상이 아니기 때문에 JNDI의 명칭 공간에 직접 등록할 수 없고 간접적으로 등록해야 한다.네트워크 프린터의 경우 JNDI 서비스는 IP 주소와 포트를 등록할 수 있고 통신 주소가 있으면 항상 네트워크 프린터에 접근할 수 있다.
JNDI API의 javax.naming 패키지에는 네트워크 프린터와 같은 자원을 대표하는 Reference 클래스가 있습니다.Reference 객체는 리소스의 통신 주소를 나타내는 일련의 RefAddr 객체를 포함합니다.Reference 대상에는 인용된 대상의 클래스 이름과 대상 공장의 클래스 이름도 포함되어 있으며 인용된 대상이lookup될 때 대상 공장은 인용된 대상의 실례를 실시간으로 만들 수 있습니다.예를 들어 고객이 JNDI를 통해 유일한 ID를 얻으려면 JNDI에 IDFactory를 등록합니다.이 플랜트는 증가 순서로 ID를 생성합니다.고객이 lookup 방법을 호출하여 ID를 얻었을 때 매번 다른 유일한 ID를 얻었다.
4http://blog.csdn.net/lldwolf/archive/2008/04/17/2299622.aspx 이 글은 Referencable, Reference 등의 용법을 비교적 잘 소개했다.
BindedClass 및 BindedClassFactory

1.package lld.test.jndi;   
2.  
3.import javax.naming.NamingException;   
4.import javax.naming.Reference;   
5.import javax.naming.Referenceable;   
6.import javax.naming.StringRefAddr;   
7.  
8.public class BindedClass implements Referenceable    
9.{   
10.    public String value;    
11.       
12.    public BindedClass()   
13.    {   
14.    }   
15.       
16.    @Override  
17.    public Reference getReference() throws NamingException   
18.    {   
19.        Reference r = new Reference(this.getClass().getName(), BindedClassFactory.class.getName(), null);   
20.        r.add(new StringRefAddr("value", this.getValue()));   
21.        return r;   
22.    }   
23.  
24.    public String getValue()   
25.    {   
26.        return value;   
27.    }   
28.  
29.    public void setValue(String value)   
30.    {   
31.        this.value = value;   
32.    }   
33.  
34.}  



1.package lld.test.jndi;   
2.  
3.import java.util.Hashtable;   
4.  
5.import javax.naming.*;   
6.import javax.naming.spi.*;   
7.  
8.public class BindedClassFactory implements ObjectFactory   
9.{   
10.    @Override  
11.    public Object getObjectInstance(Object obj, Name name, Context nameCtx,   
12.            Hashtable<?, ?> environment) throws Exception   
13.    {   
14.        if(obj instanceof Reference)   
15.        {   
16.            Reference ref = (Reference)obj;   
17.            String val = (String)ref.get("value").getContent();   
18.            BindedClass o = new BindedClass();   
19.            o.setValue(val);   
20.            return o;   
21.               
22.        }   
23.        return null;   
24.    }   
25.}  


Referenable 인터페이스는 get Reference () 를 사용하여 Reference 대상을 되돌려줍니다. BindedClass는 예시적인 구성원 변수인 Value만 설정하고 문자열 값을 저장합니다. Refernce 대상을 만들 때 인용하는 클래스 이름과 이 클래스를 만드는 공장 대상을 지정하려면 JNDI Context가 이 대상을 연결할 때 이 정보를 파일에 저장합니다.앞으로 JNDI에서 대상을 뽑을 때 공장 대상에 의존하여 파일의 내용에 따라 BindedClass 대상을 재건할 수 있습니다.여기에 귀속된 파일의 내용을 미리 말씀드리면 여러분들은 직관적인 인상을 갖게 될 것입니다. 그 내용은 다음과 같습니다.
bind1/RefAddr/0/Type=value
bind1/ClassName=lld.test.jndi.BindedClass
bind1/RefAddr/0/Encoding=String
bind1/FactoryName=lld.test.jndi.BindedClassFactory
bind1/RefAddr/0/Content=abcdefg 여러분, 앞에 BindedClass가 있습니다.getReference() 방법에는 다음과 같은 문이 사용됩니다.
r.add(new StringRefAddr("value", this.getValue()));
이 정보를 JNDI에 저장할 것을 정의하는 것입니다. 마지막 "bind1/RefAddr/0/Content=abcdefg"는 제가 뒤에 있는 예시 Bind이기 때문입니다.java에서 그 값을 "abcdefg"로 설정했을 뿐입니다. 허허.그리고 BindedClassFactory.getObjectInstance() 메서드에서
String val = (String)ref.get("value").getContent();
저장된 값을 찾는 데 쓰이는 거죠.


1.package lld.test.jndi;   
2.  
3.import java.util.Properties;   
4.  
5.import javax.naming.Context;   
6.import javax.naming.directory.DirContext;   
7.import javax.naming.directory.InitialDirContext;   
8.  
9.public class Bind   
10.{   
11.    public static void main(String[] args) throws Exception   
12.    {   
13.        Properties ps = new Properties();   
14.        ps.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");   
15.        ps.setProperty(Context.PROVIDER_URL, "file:JNDI_REF");   
16.        DirContext ctx = new InitialDirContext(ps);   
17.        String key = "bind1";   
18.  
19.        BindedClass b = new BindedClass();   
20.        b.setValue("abcdefg");   
21.        ctx.rebind(key, b);   
22.  
23.        System.out.println("Binded successfully!");   
24.        ctx.close();   
25.    }   
26.}  


1.package lld.test.jndi;   
2.  
3.import java.util.Properties;   
4.  
5.import javax.naming.Context;   
6.import javax.naming.directory.DirContext;   
7.import javax.naming.directory.InitialDirContext;   
8.  
9.public class Lookup   
10.{   
11.    public static void main(String[] args) throws Exception   
12.    {   
13.        Properties ps = new Properties();   
14.        ps.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");   
15.        ps.setProperty(Context.PROVIDER_URL, "file:JNDI_REF");   
16.        DirContext ctx = new InitialDirContext(ps);   
17.        String key = "bind1";   
18.        BindedClass o = (BindedClass)ctx.lookup(key);   
19.        System.out.println(o.getValue());       
20.           
21.        ctx.close();   
22.    }   
23.  
24.}  


http://esteem.iteye.com/blog/383499

좋은 웹페이지 즐겨찾기