2017-05-08 6 views
0

REST APIを開発中で、すべての呼び出しをcsvファイルに書きたいと思います。だから私はopencsvライブラリを使用して、私は以下のコードを書いた:各リクエストをcsvファイルに記録する方法

CSVWriter writer; 

    Map<String, Object> resultMap = new HashMap<String, Object>(); 

@RequestMapping(value="/data",produces={MediaType.APPLICATION_JSON_VALUE},method=RequestMethod.GET) 
    public ResponseEntity<Map<String, Object>> getdata(@RequestParam("id")int id,@RequestParam("user")String user) throws IOException{    
      String[] log = new String[1]; 
      log[0]=id+","+"+user+","+new Timestamp(System.currentTimeMillis())+","; 
      writer.writeNext(log); 

      writer.flushQuietly(); 
       //....rest code here 

return new ResponseEntity<Map<String, Object>>(resultMap,HttpStatus.OK); 

} 

をしかし、これはほんの数を印刷し、csv.Whyにすべての要求を印刷しません。これが起こるのでしょうか?どんな助けもありがとうございます。

+1

ログファイルを別のログファイルに記録する方が良いでしょう。ロガーの統合を確認してください。 – cody123

+0

しかし、リクエストが多いほどファイルの量は多くなります。そして、もしそれが1つのファイルであれば、必要に応じてそのファイルをcsvとしてデータベースにインポートするのは簡単です。 – Ricky

+0

@Ricky - あなたのAPIが多くの呼び出しを受け取り、すべての呼び出しが何かをCSVファイルに書き込むのを待つ必要がある場合、深刻なボトルネックになる可能性があります。 cody123が正しいです、適切なロギングを行う方法を確認してください。 –

答えて

1

まず最初に、CSVWriterをFileWriterに置き換え、同じ問題があるかどうかを確認することをお勧めします。これは実際にcsvファイルとしてログに記録するのではなく、その中にカンマを持つ1つの列を持つcsvファイルとしてログに記録するため、問題ではありません。

サービスはマルチスレッドですか? CSVロギング部分を同期ブロックで行われますので、その場合は、あなたのコードを変更:

 synchronize(this) { 
      String[] log = new String[3]; 

      log[0] = id; 
      log[1] = user; 
      log[2] = new Timestamp(System.currentTimeMillis()); 

      writer.writeNext(log); 
      writer.flushQuietly(); 
     } 

であることが起こって同時実行の問題と1つのスレッドだけでログインすることができ、この方法がある場合、私は疑問に思っていることである理由時間。

関連する問題