Настройка SVNKit при многопоточности - PullRequest
2 голосов
/ 13 сентября 2010

Я пытаюсь подключиться ко многим SVN-репозиториям параллельно, используя разные потоки, с помощью SVNKit.

Глядя на некоторые примеры кода в Интернете, похоже, что перед использованием SVNKit я должен инициализировать его с помощью статических методов

DAVRepositoryFactory.setup();
SVNRepositoryFactoryImpl.setup();
FSRepositoryFactory.setup();

Очевидно, что статические методы меня беспокоят в многопоточной среде. Мой вопрос:

  1. Можно ли использовать SVNKit таким образом, параллельно?
  2. Когда мне нужно вызывать эти методы настройки? Только в начале программного обеспечения, один раз для каждого потока, что?

Я также был бы рад, если бы кто-то мог объяснить причину, по которой я должен вызывать эти методы.

1 Ответ

2 голосов
/ 17 сентября 2010

Вы должны вызывать этот метод только один раз, прежде чем создавать экземпляры репозитория в разных потоках.

Из SVNRepositoryFactoryImpl javadoc:

сделать это один раз в вашем приложении, прежде чем использовать библиотеку, позволяющую работать с хранилищем через svn-протокол (через svn и svn + ssh)

Вот пример кода с 2 репозиториями (мононить):

SVNRepositoryFactoryImpl.setup(); // ONCE!

String url1 = "svn://host1/path1";
SVNRepository repository1 = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(url1));
String url2 = "svn://host2/path2";
SVNRepository repository2 = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(url2));

В многопоточной среде вы можете создать класс, реализующий Runnable:

public class ProcessSVN implements Runnable {

    private String url;

    public ProcessSVN(String url) {
        this.url = url;
    }

    public void run() {
        SVNRepository repository = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(url));
        // do stuff with repository
    }
}

И используйте это так:

SVNRepositoryFactoryImpl.setup(); // STILL ONCE!

(new Thread(new ProcessSVN("http://svnurl1"))).start();
(new Thread(new ProcessSVN("http://svnurl2"))).start();
...