2012-05-09 18 views
1

私のウェブサイト上でユーザが動的にアップロードした画像のサムネイルを生成するサービスをコーディングしました。これは、それが動作する方法である:Java(Spring MVC)のリソースへのアクセスを同期する

取得サムネイル:

  1. 、要求されたサイズに元の画像のサイズを変更し、ハードドライブ上にキャッシュしない場合は、このサムネイルが
  2. 前に要求されているかどうかを確認
  3. 戻るハードドライブ上

をキャッシュされたサムネイルは別の画像をアップロードします。

  1. この画像がアップロードされているかどうかを確認してください(例:ユーザーが自分のプロフィールの写真を更新することができる、古いものを削除することができます)
  2. はい、古いイメージのすべてのサムネイル
  3. 保存/新しいアップロードされた画像を上書き

を削除する問題がオンの場合ユーザがサムネイルを要求しているとき。 2人のユーザーが全く同じ時間に同じサムネイルをリクエストしていて、以前にサイズ変更されていない場合はどうなりますか?どちらの要求でも、元の画像のサイズを変更し、ハードドライブに保存するようサーバーに指示します。 両方の要求が同時に同じファイルをハードドライブに書き込もうとします。、明らかなアクセスの問題が発生します。

Spring MVCでこの競合を回避するにはどうすればよいですか?ファイルの存在のため

@RequestMapping("/images/{width:\\d{1,10}}x{height:\\d{1,10}}/{subject:.+}.{ext:png|gif|jpg|PNG|GIF|JPG}") 
public void thumbnail(HttpServletResponse response, 
        HttpServletRequest request, 
        @PathVariable("width") int width, 
        @PathVariable("height") int height, 
        @PathVariable("subject") String subject, 
        @PathVariable("ext") String ext) throws IOException 
{ 
    // ... 
} 
+0

サービスコードを掲載できますか?シンプルな同期問題のように聞こえる? – MikePatel

答えて

1
  • チェック:すべてこのサムネイルロジックは、このような春のコントローラ内部で管理されています。

  • ファイルが存在しない場合は

    • はReentrantLockのを作成し、putIfAbsent()方法を使用して、キーとしてファイルのパスと、のConcurrentHashMapに保管してください。

    • putIfAbsent()がロックを返した場合は、このロックを次のように使用します。それ以外の場合は、作成してマップに格納したロックを使用します。

    • ReentrantLockのロックを取得します。

    • ロックを取得したら、ファイルが存在するかどうかを確認します。そうでない場合は作成してください。そうでなければ、あなたは何もする必要はありません。

    • ロックを解放し、マップから削除します(finallyブロック内)。

  • ファイルを読み込んで内容を返します。

関連する問題