[
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.