這不是一個Java問題。如果您希望應用程序獨立運行,不需要副本,則應該使用shell腳本或java應用程序在某處創建和刪除鎖定。
你其實開始多個Java的通過使用相同的命令啓動多個批處理作業。 Windows和Java現在都不是你想要的。你可以通過類似的方式解決:
public static void main(String [ ] args)
{
createLockIfNotExists();
try {
yourstuff;
} finally {
releaseLock();
}
}
private static void createLockIfNotExists() throws MyLockAlreadyExists {
// A bit tricky
// check if LOCKFILE exists, if yes throw MyLockAlreadyExists
// try to create LOCKFILE, can fail if at 1 ms earlier an other app created
// that file, so an exception while creating also results in LockAlreadyExists
}
是否有很好的例子來處理這種鎖定?也許在Apache Commons中?
Here似乎是Windows的一個運行示例。
你也可以使用數據庫來寫你的鎖。當然,在使用鎖定表之前先鎖定鎖定表,這樣不會有2個進程同時寫入它們的鎖,然後讀取鎖定記錄以檢查是否真的獲得了鎖。像僞代碼:
SELECT * FROM lock_table;
if locks.length > 0: someone else is running
LOCK lock_table;
INSERT INTO lock_table VALUES(my_pid);
UNLOCK lock_table;
SELECT pid FROM lock_table;
if pids.length > 1: what happened?
if pids[0] != my_pid: someone else got the lock
多一點的果汁,你也不僅增加了PID也是一個時間戳,並檢查時間戳是否是陳舊的(太舊)。
請參閱http://stackoverflow.com/questions/177189/how-to-implement-a-single-instance-java-application – RichardOD 2010-03-08 15:57:58
聽起來像昨天是該過程花費了一分多鐘才完成的第一次。由於它尚未做到將數據標記爲已處理的數據,一分鐘後開始的二次數據認爲它有工作要做。以下建議的鎖定解決方案應該可以幫助您永久解決問題。作爲臨時解決方案,將作業之間的時間增加到5或10分鐘。 – 2010-03-08 17:44:52
克里斯,感謝您的意見。 這是我對Sql-Server作業的理解,它會等到作業完成再開始之前。它在一小時內運行1分鐘,所以如果它在05:01:00運行並且運行到05:02:25它將等到05:03:00再次運行。 我打算讓我們列出解決問題的解決方案之一。我希望能更好地理解這個問題。我寫了很多這樣的過程,這是我第一次看到這個問題。 – kevingreen 2010-03-08 18:24:03