0

このクラスに問題があります:

package it.test;


import java.net.Socket;
import java.net.ServerSocket;
import java.io.*;
import javax.naming.*;
import javax.naming.directory.*;

import java.util.Calendar;
import java.util.Hashtable;

public class ReadTimeoutTest {

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

    boolean passed = false;

    // Set up the environment for creating the initial context
    Hashtable<String, String> env = new Hashtable<String, String>(11);
    env.put(Context.INITIAL_CONTEXT_FACTORY,
            "com.sun.jndi.ldap.LdapCtxFactory");
    env.put("com.sun.jndi.ldap.read.timeout", "1000");
    env.put(Context.PROVIDER_URL, "ldap://localhost:2001");

    Server s = new Server();

    try {

        // start the server
        s.start();

        // Create initial context
        DirContext ctx = new InitialDirContext(env);
        System.out.println("LDAP Client: Connected to the Server");

        // Close the context when we're done
        ctx.close();
    } catch (NamingException e) {
        e.printStackTrace();
        System.out.println("Server: Connection refused"+" "
        +Calendar.getInstance().getTime());
    }
    s.interrupt();
}

static class Server extends Thread {

    static int serverPort = 2001;

    Server() {
    }

    public void run() {
        try {
            ServerSocket serverSock = new ServerSocket(serverPort);
            Socket socket = serverSock.accept();
            System.out.println("Server: Connection accepted"+" "
                    +Calendar.getInstance().getTime());

            BufferedInputStream bin = new BufferedInputStream(socket.
                    getInputStream());
            while (true) {
                bin.read();
            }
        } catch (IOException e) {
            // ignore
        }
    }
}
}

LDAP呼び出しのタイムアウトをテストし、タイムアウト後にnaimngExceptionを取得する必要があります。これは、Windowsでは正常に機能しますが、LDAP接続を待機し続けるLinuxでは機能しません。Linuxでタイムアウトを正しく設定できず、NamingExceptionが発生しません。私は何をすべきか?

4

2 に答える 2

3

Java 1.5 を使用しているため、明らかにこれを見逃しています。

これは、プロパティ自体が 1.6 で導入されたことを意味しているに違いありません。これは、ソケットには年ドット以降の読み取りタイムアウトがあったためです。

于 2012-10-19T09:11:45.610 に答える
0

JNDI は多くの理由で新しいコードで使用すべきではありません。その 1 つはタイムアウトの問題ですが、他にも多くの理由があります。

  • JNDI は切断された構成を使用します
  • JNDI は完全な LDAP 標準をサポートしていません
  • ネット上の JNDI の例は本当にひどいものです

代わりにUnboundID LDAP SDKを使用してください。この SDK は、接続タイムアウトだけでなく、一般的な操作タイムアウトもサポートしており、タイムアウト時に操作を自動的に破棄することもサポートしています。

こちらもご覧ください

于 2012-10-20T08:44:11.593 に答える