2013-05-30 2 views
2

최근에이 문제를 접했고 누군가가 저에게 어떤 도움을 줄 수 있는지 궁금합니다.쿼리 매개 변수를 사용하여 Runtime에서 Runtime으로 mongoexport 호출하기 (인코딩 문제?)

특정 날짜 범위로 내보내기가 제한된 Java 응용 프로그램에서 mongoexport를 수행하려고합니다. 내 쿼리 명령을 구성하고이를 Runtime.exec에 전달했습니다. 코드 2와 함께 "너무 많은 위치 옵션"을 반환합니다.

그러나 exec (아래에서 로그 아웃)로 전달 된 문자열을 명령 줄에서 실행하면 완벽하게 작동합니다!

본인은 "쿼리"매개 변수이 좁혀했습니다 -이으로 명령을 구성하지 않는 경우, 명령이 나는 그것의 추측하고있어

Runtime.exec의()를 통해 완벽하게 실행됩니다 몇 가지 인코딩 문제가 쿼리 매개 변수에서 따옴표로 할 수 있지만, 내 삶에 대해 그것을 해결하는 방법을 알아낼 수 없습니다.

@Override 
public void doWork() { 
    logger.info("Doing work"); 

    //get the host for performing the mongo dump 
    String mongohome = GlimmerServer.config.getString("mongo.home"); 
    String host = GlimmerServer.config.getString("mongo.dumphost"); 
    String port = GlimmerServer.config.getString("mongo.dumpport"); 
    String db = GlimmerServer.config.getString("mongo.dumpdb"); 
    String collection = "stats_advert_daily"; 
    String query = "'{date : new Date(1320451200000)}'"; //needs to be a proper query for mongo 
    String outputlocation = "/tmp/output.txt"; //needs to be asigned a random number name  

    String command = String.format(mongohome+"/bin/mongoexport " + 
      "--host %s " + 
      "--port %s " + 
      "--db %s " +   
      "--collection %s " +     
      "--query %s " + 
      "--fields _id,account_rid " +    
      "--out %s " +   
      "--slaveOk true " +   
      "--csv " + 
      "-vvvvv", 
      host,port,db,collection,query,outputlocation); 

    logger.info(command); 

    try{    
      Runtime rt = Runtime.getRuntime();    
      Process pr = rt.exec(command); 
      StreamGobbler errorGobbler = new StreamGobbler(pr.getErrorStream(),"ERROR",logger); 
      StreamGobbler outputGobbler = new StreamGobbler(pr.getInputStream(),"OUTPUT",logger); 
      errorGobbler.start(); 
      outputGobbler.start(); 
      int exitVal = pr.waitFor(); 

      logger.info(String.format("Process executed with exit code %d",exitVal)); 

    }catch(Exception e){ 
     logger.error(String.format("Error running task. Exception %s", e.toString())); 
    }  

} 

모든 도움 감사 :

여기에 코드입니다!

답변

1

이이 문제에 관련이 밝혀

건배, 더그 : 쿼리에 Command fails in script, works in command line

String query = "'{date : new Date(1320451200000)}'"; 

공간은 일부 구문 분석 문제가 발생했다.

또한 작은 따옴표는 필요하지 않습니다. 따라서 offfending 코드는 이제 다음과 같습니다

String query = "{date:Date(1320451200000)}"; 

을 지금, 나는이 작동하지 않는 쉘 (작은 따옴표를 필요로) 아직() Runtime.exec의를 통해 실행에에 전체 명령을 복사합니다.

+0

감사합니다. 그것은 나를 위해 일한다. – Guillaume

관련 문제