Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Dызов SVN команд через ProcessBuilder


Автор: Andy_L20066 16.11.2010, 13:00
Привет

есть у меня ProcessBuilder который запускает внешнюю програмку (svn cleanup, svn update) которая соответственно что-то пишет в InputStream. Локально все отрабатывает, а вот если деплою свой модуль на сервер - то Process который порождается ProcessBuilder - зависает.... :
1. проблема в том что всегда при запуске процеса (Треда) нужно вычитывать полностью InputStream? Если да - то как лучше такое сделать: запускать чтение из InputStream в отдельном потоке? Какие есть best practices по данному делу?  

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

Спасибо

Автор: jk1 16.11.2010, 13:37
Есть http://svnkit.com/ для работы с svn из Java

Автор: Andy_L20066 16.11.2010, 14:11
Спасибо, нарыл сразу после того как вопрос задал...., изучаю чего она может.... ну а вот с потоками хотелось бы всетаки разобратся

Автор: Andy_L20066 16.11.2010, 15:01
вообщем не знаю в чем может быть проблема, процесс 'svn update' запускается через quartz job (джарка находится на JBoss), может quartz не дает доступа или как: 

Код

@MessageDriven(activationConfig =
{@ActivationConfigProperty(propertyName = "cronTrigger", propertyValue = "0/30 * * * * ?")})
@ResourceAdapter("quartz-ra.rar")
public class AnnotatedQuartzMDBBean implements Job
{
   private static final Logger log = Logger.getLogger(AnnotatedQuartzMDBBean.class);

   public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException
   {
      AnnotatedQuartzMDBBean.log.info("************** here in annotated!!!!");
      
      SvnCleanUpCommand svnCleanUpCommand = new SvnCleanUpCommand();
      svnCleanUpCommand.execute();

    }
}


код SVNCleanup
Код

public class SvnCleanUpCommand extends AbstractCommand {

    protected static final Logger logger = Logger.getLogger(SvnCleanUpCommand.class.getName());

    public void execute() {
        logger.log(Level.INFO, "Executing 'svn cleanup'...");
        ProcessBuilder builder = new ProcessBuilder("svn", "cleanup");
        builder.redirectErrorStream(true);
        builder.directory(new File(Utils.loadProperties().getProperty("targetdir")));

        Process processCln = null;
        try {
            processCln = builder.start();
        } catch (IOException ex) {
            logger.log(Level.SEVERE, null, ex);
        }
        logger.log(Level.INFO, " Starting 'svn output reader' thread...");
        StreamReaderThread outputReader = new StreamReaderThread(processCln.getInputStream(),"OUTPUT");
        outputReader.start();

        try {
            int result = processCln.waitFor(); // ТУТ ЗАВИСАЕТ
            logger.log(Level.INFO, "Process 'svn update' ended up with result: {0}", result);
        } catch (InterruptedException ex) {
            processCln.destroy();
        }
        try {
            logger.log(Level.INFO, "Join man thread after completion of reading");
            outputReader.join();
        } catch (InterruptedException ex) {
            Logger.getLogger(SvnCleanUpCommand.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}


тут StreamReader просто читает InputStream.... локально оно срабатывает, а на JBoss виснет 

Автор: Andy_L20066 17.11.2010, 12:22
вообщем решил через эту либу... с потоками нету времени разбиратся )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)