ok, in case somebody has the same problem:
The problem is the true value in
FSDirectory directory = FSDirectory.getDirectory("C:\\temp\\a", true);
it deletes the previous lock file, that belongs to the lock adquired
by the first process. Changing it to false prevents the lock being
deleted and locking works ok

On 6/20/06, jm <[EMAIL PROTECTED]> wrote:
Hi,

I am trying to peruse lucene's Lock for my own purposes, I need to
lock several java processes and I thought I could reuse the Lock
stuff. I understand lucene locks work across jvm.

But I cannot make it work. I tried to reproduce my problem in a small class:

public class SysLock {
    private static final Logger logger = Logger.getLogger(SysLock.class);

    private int id;

    public SysLock(int i) {
        id = i;
    }

//    public static void main(String[] args) throws Exception {
//        System.setProperty("org.apache.lucene.lockDir", "C:\\temp\\todel");
//        SysLock l1 = new SysLock(1);
//        SysLock l2 = new SysLock(2);
//
//        TransferThread t = l1.new TransferThread(l1);
//        t.start();
//        TransferThread t2 = l2.new TransferThread(l2);
//        t2.start();
//
//        logger.info("Finished.");
//    }

    public static void main(String[] args) throws Exception {
        System.setProperty("org.apache.lucene.lockDir", "C:\\temp\\todel");
        SysLock l1 = new SysLock(new Date().getSeconds());

        TransferThread t = l1.new TransferThread(l1);
        t.start();

        logger.info("Finished.");
    }

    private void forever() throws IOException {
        FSDirectory directory = FSDirectory.getDirectory("C:\\temp\\a", true);
        try {
            new Lock.With(directory.makeLock("COMMIT_LOCK_NAME"),
COMMIT_LOCK_TIMEOUT) {
                public Object doBody() throws IOException {
                    while (true) {
                        System.out.println("i'm " + id);
                        try {
                            Thread.sleep(2000);
                        }
                        catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.run();
        }
        catch (Exception e) {
            System.out.println(id + " could not get lock");
        }
    }

    class TransferThread extends Thread {
        public TransferThread(SysLock sl) {
            this.sl = sl;
        }

        public void run() {
            try {
                sl.forever();
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        private SysLock sl;
    }
}

When I run the main() that is commented (that is, the lock works with
two threads in the same jvm) it works ok, the second TransferThread
cannot get the lock.

But when I run the uncommented main() twice, both processes adquire a
lock, even if only one lock file exists in the lockdir. Something I am
missing probably....

Many thanks
javi


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

Reply via email to