[ 
https://issues.apache.org/activemq/browse/CAMEL-1583?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Christopher Hunt updated CAMEL-1583:
------------------------------------

    Attachment: LdapProducer.java.diff

Changes to the 1.6.1 branch.

In essence a context is retrieved from the registry each time that an exchange 
is to be produced.

Given that the contract for an InitialContext states:

_An InitialContext instance is not synchronized against concurrent access by 
multiple threads. Multiple threads each manipulating a different InitialContext 
instance need not synchronize. Threads that need to access a single 
InitialContext instance concurrently should synchronize amongst themselves and 
provide the necessary locking._

The registry entry should either: (a) provide an InitialContext that is known 
to be thread safe; or (b) ensure that the registry instantiates a new bean each 
time that the bean is looked up. The latter will be the general situation and 
so, for example with Spring IOC, use a bean declaration similar to:

{code}
        <!-- Directory Context -->
        <bean id="ldapserver" class="javax.naming.directory.InitialDirContext" 
scope="prototype">
                <constructor-arg>
                        <props>
                                <prop 
key="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</prop>
                                <prop 
key="java.naming.provider.url">ldap://localhost:10389</prop>
                                <prop 
key="java.naming.security.authentication">none</prop>
                        </props>
                </constructor-arg>
        </bean>
{code}

It is important to use a prototype scope to ensure that a new directory context 
is obtained for each exchange produced.

> ldap component is not thread safe
> ---------------------------------
>
>                 Key: CAMEL-1583
>                 URL: https://issues.apache.org/activemq/browse/CAMEL-1583
>             Project: Apache Camel
>          Issue Type: Bug
>          Components: camel-ldap
>    Affects Versions: 1.6.0, 2.0-M1
>         Environment: N/A
>            Reporter: Christopher Hunt
>         Attachments: LdapProducer.java.diff
>
>
> JNDI context objects are not thread-safe. The LDAP component shares a 
> directory context across all threads that use the component. This is not safe.
> In addition the LDAP component will attempt to establish a connection on 
> instantiation of the component, and not when the component is required to 
> process requests. If the LDAP server is not ready e.g. temporarily 
> unavailable then the entire Camel application will stop.
> JNDI directory contexts should be established when a consuming thread needs 
> it and should be released when the thread is finished with the component i.e.:
> {code}
> ctx = new InitialDirContext(env);
> try {
>   ...
> } finally {
>   ctx.close();
> }
> {code}
> The above will release the connection with the LDAP server as soon as 
> possible. The existing component relies on JNDI to release the socket in its 
> own time (several seconds later).

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to