Procházet zdrojové kódy

旋转图片改为异步实现

ting.yin před 6 roky
rodič
revize
b980042bf0

+ 7 - 2
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -99,8 +99,13 @@ public class DataUploadService {
 
         Paper exist = paperRepo.findByWorkIdAndSubjectAndExamNumber(student.getWorkId(), subject,
                 student.getExamNumber());
-        String sheetMD5 = DigestUtils.md5Hex(in);
-        String sliceMD5 = DigestUtils.md5Hex(new FileInputStream(thumbFileName));
+        
+        FileInputStream sheetIn = new FileInputStream(savePath + File.separator + student.getExamNumber() + ".jpg");
+        FileInputStream slicein = new FileInputStream(thumbFileName);
+        String sheetMD5 = DigestUtils.md5Hex(sheetIn);
+        String sliceMD5 = DigestUtils.md5Hex(slicein);
+        sheetIn.close();
+        slicein.close();
         if (exist != null) {
             exist.setManual(isManual);
             exist.setUploadedOn(new Date());

+ 28 - 34
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/ImageApi.java

@@ -1,19 +1,22 @@
 package cn.com.qmth.stmms.ms.collect.api;
 
-import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
-import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
-import cn.com.qmth.stmms.ms.core.domain.Paper;
-import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
+import java.util.HashSet;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.*;
-import java.nio.file.Path;
-import java.nio.file.Paths;
+import cn.com.qmth.stmms.ms.collect.util.RotateTask;
+import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 
 /**
  * Created by zhengmin on 2017/2/24.
@@ -27,33 +30,24 @@ public class ImageApi {
 
     @Autowired
     private SystemConfig systemConfig;
+    
+    private ExecutorService executor = Executors.newFixedThreadPool(10);
+    
+    private HashSet<String> papers = new HashSet<String>();
 
     @RequestMapping(value = "{paperId}/rotate",method = RequestMethod.GET)
-    public ResponseEntity rotate(@PathVariable Long paperId,
-                                 @RequestParam int degree){
-        Paper paper = paperRepo.findOne(paperId);
-        Path thumbPath = Paths.get(systemConfig.getThumbDir(),String.valueOf(paper.getWorkId()),paper.getSubject().toString(),paper.getAreaCode(),paper.getExamNumber() + ".jpg");
-        Path imagePath = Paths.get(systemConfig.getImageDir(),String.valueOf(paper.getWorkId()),paper.getSubject().toString(),paper.getAreaCode(),paper.getExamNumber() + ".jpg");
-        try {
-            File thumbFile = thumbPath.toFile();
-            if(thumbFile.exists()) {
-                InputStream is = new FileInputStream(thumbFile);
-                BufferedImage image = ImageIO.read(is);
-                ImageCompression.rotate(thumbFile, thumbFile, degree);
-                is.close();
-            }
-            File imageFile = imagePath.toFile();
-            if(imageFile.exists()){
-                InputStream is = new FileInputStream(imageFile);
-                BufferedImage image = ImageIO.read(is);
-                ImageCompression.rotate(imageFile, imageFile, degree);
-                is.close();
-            }
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        } catch (IOException ioe){
-            ioe.printStackTrace();
+    public ResponseEntity rotate(@PathVariable Long paperId,@RequestParam int degree){
+    	Paper paper = paperRepo.findOne(paperId);
+        if(!papers.contains(paper.getExamNumber())){
+        	executor.submit(new RotateTask(paper,degree,paperRepo,systemConfig,papers));
+        	papers.add(paper.getExamNumber());
         }
         return new ResponseEntity(HttpStatus.OK);
     }
+    
+    @RequestMapping(value = "process",method = RequestMethod.GET)
+    public ResponseEntity process(){
+    	return new ResponseEntity(papers.size(),HttpStatus.OK);
+    }
+
 }

+ 71 - 0
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/util/RotateTask.java

@@ -0,0 +1,71 @@
+package cn.com.qmth.stmms.ms.collect.util;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashSet;
+
+import javax.imageio.ImageIO;
+
+import org.apache.commons.codec.digest.DigestUtils;
+
+import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
+import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
+
+public class RotateTask  implements Runnable {
+	
+    private Paper paper;
+    private int degree;
+    private PaperRepo paperRepo;
+    private SystemConfig systemConfig;
+    private HashSet<String> papers;
+
+    public RotateTask(Paper paper,int degree, PaperRepo paperRepo, SystemConfig systemConfig, HashSet<String> papers) {
+    	this.paper = paper;
+        this.degree = degree;
+        this.paperRepo = paperRepo;
+        this.systemConfig = systemConfig;
+        this.papers = papers;
+    }
+
+	@Override
+	public void run() {
+		long start = System.currentTimeMillis();
+		 Path thumbPath = Paths.get(systemConfig.getThumbDir(),String.valueOf(paper.getWorkId()),paper.getSubject().toString(),paper.getAreaCode(),paper.getExamNumber() + ".jpg");
+	     Path imagePath = Paths.get(systemConfig.getImageDir(),String.valueOf(paper.getWorkId()),paper.getSubject().toString(),paper.getAreaCode(),paper.getExamNumber() + ".jpg");
+		try {
+			File thumbFile = thumbPath.toFile();
+			if (thumbFile.exists()) {
+				InputStream is = new FileInputStream(thumbFile);
+				BufferedImage image = ImageIO.read(is);
+				ImageCompression.rotate(thumbFile, thumbFile, degree);
+				is.close();
+			}
+			File imageFile = imagePath.toFile();
+			if (imageFile.exists()) {
+				InputStream is = new FileInputStream(imageFile);
+				BufferedImage image = ImageIO.read(is);
+				ImageCompression.rotate(imageFile, imageFile, degree);
+				is.close();
+			}
+	        FileInputStream in = new FileInputStream(imageFile);
+	        String sliceMD5 = DigestUtils.md5Hex(in);
+			paper.setSliceMD5(sliceMD5);
+			paperRepo.save(paper);
+			papers.remove(paper.getExamNumber());
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+		}
+		long end = System.currentTimeMillis();
+		System.out.println("完成任务,耗时:" + (end - start) + "毫秒");
+	}
+}

+ 1 - 1
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/image/ImageCompression.java

@@ -60,7 +60,7 @@ public class ImageCompression {
 
     public static void rotate(File in, File out, int degree) throws IOException {
         BufferedImage image = ImageIO.read(in);
-        Thumbnails.of(image).scale(1f).outputQuality(1f).rotate(degree).toFile(out);
+        Thumbnails.of(image).scale(1f).outputQuality(1f).rotate(degree).outputFormat("jpg").toFile(out);
     }
 
     public static void imageThumbnail(File in,File out,ImageCompressionConfig config) throws IOException{