Hello,

I posted this earlier in the Dev list as there is no answer there I posted 
again hoping that someone might know here :D

I am using lucene in an EJB environment. I have a message driven bean that 
subscribe to a queue that will consume the object that I want lucene to index.

Now the problem when I have many object in the queue, the Application Server 
will instantiated multiple message driven bean object and runs the indexing 
at the same time. When this happen I got this exception:

[IndexerMDB] Problem indexing email in indexer mdb
java.io.IOException: Index locked for write: 
Lock@/usr/kernel/jakartalucene/install/write.lock
� � � � at org.apache.lucene.index.IndexWriter.<init>(Unknown Source)
� � � � at org.apache.lucene.index.IndexWriter.<init>(Unknown Source)
� � � � at com.nuix.indexer.IndexerMDB.indexData(IndexerMDB.java:304)

Only the first message driven bean will successfully index the data.

I had a look on the code and really FSDirectory will just simply fail if it 
can't create the new lock file! Is this done on purpose? Why can't 
IndexWriter tries for a few times to create the lock file? Do I miss 
something really big here?

I modified FSDirectory as follow so it works in our environment. Please 
comment on this change and just slam me if this is blatantly against lucene 
framework :D

Basically I changed it so it does not fail straight away, instead try and 
wait for creating the new file.

RCS file: 
/usr/local/cvsroot/nuix/kernel/jakartalucene/dist/src/java/org/apache/lucene/store/FSDirectory.java,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 FSDirectory.java
--- FSDirectory.java � �4 Apr 2002 01:14:11 -0000 � � � 1.1.1.1
+++ FSDirectory.java � �22 May 2002 07:19:20 -0000
@@�-218,7 +218,19 @@
� � �return new Lock() {
� � � � public boolean obtain() throws IOException {
� � � � � �if (Constants.JAVA_1_1) return true; � �// locks disabled in jdk 
1.1
- � � � � �return lockFile.createNewFile();
+ � � � � �boolean locked = false;
+ � � � � �locked = lockFile.createNewFile();
+ � � � � �for (int count = 0; count < 100 && !locked; count++) {
+ � � � � � � �try {
+ � � � � � � � � �Thread.sleep(100);
+ � � � � � � � � �locked = lockFile.createNewFile();
+ � � � � � � �} catch (InterruptedException e) {
+ � � � � � � � � �e.printStackTrace();
+ � � � � � � � � �return false;
+ � � � � � � �}
+ � � � � � � �
+ � � � � �}
+ � � � � �return locked;
� � � � }
� � � � public void release() {
� � � � � �if (Constants.JAVA_1_1) return; � � � � // locks disabled in jdk 
1.1
-- 
Victor Hadianto

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to