It is possible to have multiple instances of a poller endpoint attempting to read a file on the system. To ensure that there are no conflicts in accessing the file, poller endpoints obtain an exclusive lock on a file while it is being processed.
The locking behavior is controlled by an implementation of the
org.apache.servicemix.common.locks.LockManager
interface. By default,
poller endpoints use a provided implementation of this interface. If the default behavior is not appropriate
for your application, you can implement the LockManager
interface and configure
your endpoints to use your implementation.
To implement a custom lock manager, you need to provide your own implementation of the
org.apache.servicemix.common.locks.LockManager
interface. The
LockManager
has single method, getLock()
that needs to be implemented. Example 2.8 shows the signature for
getLock()
.
The getLock()
method takes a string that represents the URI of the file being
processes and it returns a java.util.concurrent.locks.Lock
object. The
returned Lock
object holds the lock for the specified file.
Example 2.9 shows a simple lock manager implementation.
Example 2.9. Simple lock manager implementation
package org.apache.servicemix.demo; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.apache.servicemix.common.locks.LockManager; public class myLockManager implements LockManager { private ConcurrentMap<String, Lock> locks = new ConcurrentHashMap<String, Lock>(); public Lock getLock(String id) { Lock lock = locks.get(id); if (lock == null) { lock = new ReentrantLock(); Lock oldLock = locks.putIfAbsent(id, lock); if (oldLock != null) { lock = oldLock; } } return lock; } }
You configure a poller endpoint to use a custom lock manager using its lockManager
attribute.
The lockManager
attribute's value is a reference to a bean
element
specifying the class of your custom lock manager implementation.
Example 2.10 shows configuration for a poller endpoint that uses a custom lock manager.
Example 2.10. Poller endpoint using a custom lock manager
<beans xmlns:file="http://servicemix.apache.org/file/1.0" xmlns:foo="http://servicemix.org/demo/"> <file:poller service="foo:filePoller" endpoint="filePoller" targetService="foo:fileSender" file="inbox" lockManager="#myLockManager" /> <bean id="myLockManager" class="org.apache.servicemix.demo.myLockManager" /> ... </beans>
![]() | Note |
---|---|
You can also configure a poller endpoint to use a custom lock manager by adding a child
|