2

LDAPを使用してユーザーの詳細を取得するアプリケーションを扱っています。ユーザーの詳細を取得するのに時間がかかる場合があります。最悪の場合にサーバーでトランザクションがハングしないように、詳細を取得するメソッドにタイムアウトを実装したいと考えています。

ここでは、必要な詳細を取得するようにクラスをLdapUtil構成したクラスを使用しています。LdapTemplate

LDAP メソッドにタイムアウトを実装するにはどうすればよいですか? (この場合はldapTemplate.search(...)メソッド)

public class LdapUtil {

    @Autowired(required = true)
    @Qualifier(value = "ldapTemplateApp")
    LdapTemplate ldapTemplate;

    public Set < ProductGroup > findProducts(String UserId) {
        final Set < ProductGroup > products = newHashSet();
        // Lookup the user         
        String usrFilter = String.format(USERID_FILTER, globalUserId);

        ldapTemplate.search("ou=Members", usrFilter, // note this line
        new NameClassPairCallbackHandler() {

            public void handleNameClassPair(NameClassPair nameClassPair) {
                SearchResult result = (SearchResult) nameClassPair;
                String user = result.getNameInNamespace();

                String GrpFilter = String.format(GROUP_FILTER, user);

                List < String > zonePrefixes = ldapTemplate.search("Zones", GrpFilter, // note this line
                new AttributesMapper() {
                    public Object mapFromAttributes(Attributes attributes) throws NamingException {
                        return substringBeforeLast((String) attributes.get("cn").get(), "-") + "-";
                    }
                });

            }
        });

        products.remove(null);
        return newHashSet(products);
    }
}   

ldapTemplete が構成されているLDAP.xmlが 1 つあります。

<beans xmlns="------">
<!-- LDAP -->
<bean id="contextSourceApp" class="org.springframework.ldap.pool.factory.PoolingContextSource">
<property name="contextSource" ref="contextSourceTargetApp" />
<property name="dirContextValidator">
<bean id="dirContextValidator"   
class="org.springframework.ldap.pool.validation.DefaultDirContextValidator"/>
</property>         
<property name="testOnBorrow" value="true" />
</bean>
<bean id="contextSourceTargetApp" class="org.springframework.ldap.core.support.LdapContextSource">
    <property name="url" value="${ldap.url}" />
    <property name="base" value="${ldap.base.}" />
    <property name="userDn" value="${ldap.user}" />
    <property name="password" value="${ldap.password}" />
    <property name="pooled" value="false" />
</bean>

<bean id="ldapTemplateApp" class="org.springframework.ldap.core.LdapTemplate">
    <constructor-arg ref="contextSourceApp" />
</bean>

私はいくつかのクエリを持っています:

  1. LDAP メソッドの TIMEOUT をどのように実装し、どのように構成することができますか? (LDAP フレームワークのタイムアウト設定が存在するクラス)

  2. それらをxmlファイル、つまりLDAP.xml(この場合)で構成する方法はありますか?

4

2 に答える 2

10

解決策を見つけました。ldap.xml ファイルに次のプロパティを追加しました。これまでのところ、私にとってはうまくいきました。

<bean id="contextSourceTargetApp" 
      class="org.springframework.ldap.core.support.LdapContextSource">
    <property name="baseEnvironmentProperties">
        <map>
            <entry key="com.sun.jndi.ldap.connect.timeout" value="5000" />          
        </map>  
    </property>
</bean>

LDAP タイムアウトの実装について何か考えがある場合は、他の解決策を投稿してください。

于 2014-05-28T08:08:04.557 に答える
3

ldap.xmlActiveDirectoryLdapAuthenticationProviderファイルを使用したソリューションではうまくいきませんでした。代わりにjndi.properties、次の内容のファイルをクラスパスに追加しました。

com.sun.jndi.ldap.connect.timeout=500
于 2017-01-09T09:38:48.693 に答える