Wir lassen Benutzer einige Bilddateien auf unseren Webserver hochladen. Diese Dateien sind 10-15 Minuten nach dem Hochladen nutzlos. Gibt es eine Möglichkeit, diese Dateien automatisch zu löschen, z. alle Bilddateien, die 15 Minuten nach ihrer Erstellung in ihrem Namen "abgelaufen" sind?Wie in der Anlegestelle Housekeeping zu tun?
Antwort
ich im Grunde Setup Quarz-Scheduler in meinem Webserver mit einem cron-Trigger
und der Job sahen mehr oder ähnliche
public static void deleteFilesOlderThanNdays(int daysBack, String dirWay, org.apache.commons.logging.Log log) {
File directory = new File(dirWay);
if(directory.exists()){
File[] listFiles = directory.listFiles();
long purgeTime = System.currentTimeMillis() - (daysBack * 24 * 60 * 60 * 1000);
for(File listFile : listFiles) {
if(listFile.lastModified() < purgeTime) {
if(!listFile.delete()) {
System.err.println("Unable to delete file: " + listFile);
}
}
}
} else {
log.warn("Files were not deleted, directory " + dirWay + " does'nt exist!");
}
}
ref: http://www.coderanch.com/t/384581/java/java/Delete-Files-Older-days
Ich glaube nicht, Jetty hat eine eingebaute Funktion dafür. Sie könnten eine Art GarbageCollector Klasse erstellen und das Löschen einer Datei planen mit einem ScheduledExecutorService:
public class GarbageCollector {
private ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
public void scheduleFileDeletion(Path path) {
service.schedule(() -> {
try {
Files.delete(path);
} catch (IOException ignored) {
}
}, 15, TimeUnit.MINUTES);
}
}
es so etwas in Anlegesteg, wie mlapeyre sagt. Schauen Sie sich Guavas cache an.
So etwas wird es tun, ich denke:
Cache<Key, Graph> graphs = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.removalListener(DELETE_FILES_LISTENER)
.build();
Sie nur Ihre eigene Frage beantwortet - alle Dateien mit Wort bekommen „verfallen“ im Namen und modifizierte 15 Minuten vor aktuelle Zeit und löschen .
Hier ist Code. Es ist nicht effizient, aber einfach:
File dir=new File(".");
String []expiredFiles=dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return (name.contains("expired")&& new File(dir,name).lastModified()<System.currentTimeMillis()-15*60*1000);
}
});
for(String file:expiredFiles){
new File(dir,file).delete();
}
Sie können es alle 15 Minuten oder so ausführen. Oder, einfacher, führen Sie es aus, wenn jede Anfrage beantwortet und geschlossen wird, aber der Thread noch nicht gestoppt ist. Zum Beispiel unmittelbar nach dem Schließen des Ausgabestreams auf dem Antwortobjekt. Es braucht nicht viel Ressourcen, besonders wenn der Thread läuft und noch läuft.
Eigentlich sollte es wie jede Minute ausgeführt werden :) Erstellen Sie einfach einen 'ServletContextListener', der den Lebenszyklus von' ScheduledExecutorService' verwaltet und Ihren Zeitplan einplant Reinigungsjob, der jede Minute ausgeführt wird. –
Erstellen Sie eine Modellklasse zum Speichern von Informationen zum Hochladen von Bildern wie imagePath
und uploadedTime
.
class UploadedImage {
private Path imagePath;
private long uploadedTime;
public UploadedImage(Path imagePath, long uploadedTime) {
this.imagePath = imagePath;
this.uploadedTime = uploadedTime;
}
public Path getImagePath() {
return imagePath;
}
public long getUploadedTime() {
return uploadedTime;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final UploadedImage other = (UploadedImage) obj;
if (!Objects.equals(this.imagePath, other.imagePath)) {
return false;
}
if (this.uploadedTime != other.uploadedTime) {
return false;
}
return true;
}
}
erstellen UploadedImage Objekt für jedes Bild-Upload und speichern sie in einer globalen Arraylist.
//...
ArrayList<UploadedImage> imageBucket = new ArrayList<>();
//...
public synchronized void uploadingImage(Path imagePath, long uploadedTime){
imageBucket.add(new UploadeImage(imagePath, uploadedTime));
}
Und bereiten Sie einen Thread zum Löschen der Dateien wie folgt vor.
boolean deletionOff = false;
new Thread(new Runnable() {
private final long IMAGE_LIFE_TIME = 1000 * 60 * 15;//fifteen minutes
@Override
public void run() {
while (!deletionOff) {
//this fore-each will retrieve objects from OLDEST to NEWEST
for (UploadedImage uploadedImage : imageBucket) {
//finds the elapsed time since the upload of this image
long timeElapsed = System.currentTimeMillis() - uploadedImage.getUploadedTime();
if (timeElapsed >= IMAGE_LIFE_TIME) {
//following commands will execute only if the image is eligible to delete
try {
Files.delete(uploadedImage.getImagePath());
} catch (IOException ex) {
//
} finally {
imageBucket.remove(uploadedImage);
}
} else {
//this block will execute when IMAGE_LIFE_TIME is
//bigger than the elapsed time which means the
//selected image only have
//(IMAGE_LIFE_TIME - timeElapsed) of time to stay alive
//NOTE :
//there is no need to check the next UploadedImage
//objects as they were added to the list after the
//currently considering UploadedImage object,
//which is still has some time to stay alive
try {
Thread.sleep(IMAGE_LIFE_TIME - timeElapsed);
break;
} catch (InterruptedException ex) {
//
}
}
}
}
}
}).start();
- 1. Frühlings-Boot und Anlegestelle der ProxyServlet
- 2. kann nicht ausgeführt Anlegestelle start.jar
- 3. Wie zu tun! in Rubin?
- 4. FEHLER: Fehler beim Ausführen der Anlegestelle, Wie beheben?
- 5. mit Monaden zu tun, um Transformationen in Masse zu tun?
- 6. Wie interaktive SMS zu tun?
- 7. Wie bubble plot zu tun?
- 8. Wie TOS/DSCP in Rubin zu tun?
- 9. wie so etwas in sqlalchemy zu tun?
- 10. Wie Socket-Kommunikation in Android zu tun?
- 11. Wie Ereignisse in Ruby zu tun?
- 12. In PHP wie Session-Instanzen zu tun?
- 13. So aktivieren Sie die Anmeldung an der Anlegestelle?
- 14. Wie JavaScript Introspektion zu tun?
- 15. wie zu tun enthält R
- 16. wie Streuung zu tun/Operationen in numpy
- 17. Wie HTTP-Authentifizierung in Android zu tun?
- 18. Wie zu tun genetische Operationen in Matlab
- 19. Wie bedingte Aggregation in Postgres zu tun?
- 20. wie anonyme Vektor in R zu tun?
- 21. Wie in Schienen äußere Verknüpfung zu tun
- 22. wie zu tun Variable + 1 in iReport
- 23. Wie LINKS in LINQ richtig zu tun?
- 24. Wie zu tun, Textur-Änderung
- 25. Wo befindet sich die 404-Seite der Anlegestelle?
- 26. Profiling Anlegestelle mit Visualvm ist super langsam
- 27. Was erlaubt der Standard #pragma zu tun?
- 28. eine Anlegestelle Demo mit Ant BuildException Fehler
- 29. Wie Start-oder Herunterfahren Anlegestelle abbrechen, wenn WebAppContext nicht starten
- 30. Spring: wie transparente Laufzeitkonfiguration der veränderbaren Eigenschaft zu tun
warum nicht einen Cache verwenden und Speichern Sie die Bytes des Bildes direkt im Cache. Legen Sie eine Räumungs-/Ablaufzeit für den Schreibvorgang (nicht für den Zugriff) von 10-15 Minuten fest und der Cache kümmert sich automatisch um das Bild. Alle Lookups für das Bild werden direkt aus dem Cache beantwortet (solange der Eintrag nicht abgelaufen ist) –