Hallo,
in meinem aktuellen Projekt sind die Anforderungen das externe Dateien(z.B. Word/Excel) parallel geöffnet und bearbeitet werden können und das beim Schließen der Dateien dies erkannt wird.
Dies habe ich versucht über Threads und Runtime zu lösen. Es funktioniert auch sehr gut wenn zum Beispiel eine Excel-Datei, ein PDF und ein Word geöffnet wird. Sobald jedoch zwei Dateien mit der selben Erweiterung z.B. zwei Excel Dateien geöffnet werden bricht der erste Thread ab und es bleibt von den Dateien mit gleichen Erweiterungen nur ein Thread über.
Leider konnte ich durch Recherche im Netz oder Literatur noch nicht herausbekommen woran dies liegen kann.
Hat jemand dazu eine Idee wo der Hacken ist oder eine Tip wie das gelöst werden kann? Vielen Dank im voraus
Mein Code sieht wie folgt aus:
[Java]
//Methode die den Thread aufruft
public void actionPerformed(java.awt.event.ActionEvent evt) {
try {
String docNr = "DokNr";
String revNr = "revNr" ;
//Erzeuge ein Objekt welche Runtime ausführt
OpenFile oeffneFile = new OpenFile(docNr,revNr);
// Erzeuge einen Thread und übergebe das Objekt oeffneFile
new OpenFileToChange(oeffneFile).start();
} catch (Exception e) {
}
}
//Thread startet die eigentliche Aktion mit start()
public class OpenFileToChange extends Thread{
OpenFile neuerFile;
public OpenFileToChange(OpenFile neuerFile) {
this.neuerFile = neuerFile;
}
@Override
public void run() {
try {
neuerFile.start();
} catch (IOException | InterruptedException ex) {
Logger.getLogger(OpenFileToChange.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
//Methode öffnet die Datei mit Runtime indem sie den Dateipfad und den Dateinamen inkl. Erweiterung
//aus einer Datenbank holt
public class OpenFile {
String docNr, revNr;
public OpenFile(String docNr, String revNr) throws IOException, InterruptedException {
this.docNr = docNr;
this.revNr = revNr;
}
public synchronized void start() throws IOException, InterruptedException {
System.out.println("Angekommen");
String query = "Select LINKABLAGE, DATEINAME FROM T_DOKUMENT WHERE "
+ "DOKUMENTENNR='" + docNr + "' AND REVISION = " + revNr;
ResultSet rs = DBCommunication.rs(query, stm);
try {
rs.next();
String dateiAblage = rs.getString("LINKABLAGE");
String dateiName = rs.getString("DATEINAME");
datei = new File(dateiAblage + dateiName);
if (datei.exists()) {
try {
datei.setWritable(true);
Process p = Runtime.getRuntime().exec(new String[]{"cmd", "/c", dateiName},
null, new File(dateiAblage));
p.waitFor();
System.out.println(Thread.activeCount());
} finally {
FMessage meldung = new FMessage();
meldung.setLabelText("finally Runtime");
meldung.setVisible(true);
}
}
} catch (SQLException | InterruptedException | IOException ex) {
ex.printStackTrace();
}
}
}
[/Java]
in meinem aktuellen Projekt sind die Anforderungen das externe Dateien(z.B. Word/Excel) parallel geöffnet und bearbeitet werden können und das beim Schließen der Dateien dies erkannt wird.
Dies habe ich versucht über Threads und Runtime zu lösen. Es funktioniert auch sehr gut wenn zum Beispiel eine Excel-Datei, ein PDF und ein Word geöffnet wird. Sobald jedoch zwei Dateien mit der selben Erweiterung z.B. zwei Excel Dateien geöffnet werden bricht der erste Thread ab und es bleibt von den Dateien mit gleichen Erweiterungen nur ein Thread über.
Leider konnte ich durch Recherche im Netz oder Literatur noch nicht herausbekommen woran dies liegen kann.
Hat jemand dazu eine Idee wo der Hacken ist oder eine Tip wie das gelöst werden kann? Vielen Dank im voraus
Mein Code sieht wie folgt aus:
[Java]
//Methode die den Thread aufruft
public void actionPerformed(java.awt.event.ActionEvent evt) {
try {
String docNr = "DokNr";
String revNr = "revNr" ;
//Erzeuge ein Objekt welche Runtime ausführt
OpenFile oeffneFile = new OpenFile(docNr,revNr);
// Erzeuge einen Thread und übergebe das Objekt oeffneFile
new OpenFileToChange(oeffneFile).start();
} catch (Exception e) {
}
}
//Thread startet die eigentliche Aktion mit start()
public class OpenFileToChange extends Thread{
OpenFile neuerFile;
public OpenFileToChange(OpenFile neuerFile) {
this.neuerFile = neuerFile;
}
@Override
public void run() {
try {
neuerFile.start();
} catch (IOException | InterruptedException ex) {
Logger.getLogger(OpenFileToChange.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
//Methode öffnet die Datei mit Runtime indem sie den Dateipfad und den Dateinamen inkl. Erweiterung
//aus einer Datenbank holt
public class OpenFile {
String docNr, revNr;
public OpenFile(String docNr, String revNr) throws IOException, InterruptedException {
this.docNr = docNr;
this.revNr = revNr;
}
public synchronized void start() throws IOException, InterruptedException {
System.out.println("Angekommen");
String query = "Select LINKABLAGE, DATEINAME FROM T_DOKUMENT WHERE "
+ "DOKUMENTENNR='" + docNr + "' AND REVISION = " + revNr;
ResultSet rs = DBCommunication.rs(query, stm);
try {
rs.next();
String dateiAblage = rs.getString("LINKABLAGE");
String dateiName = rs.getString("DATEINAME");
datei = new File(dateiAblage + dateiName);
if (datei.exists()) {
try {
datei.setWritable(true);
Process p = Runtime.getRuntime().exec(new String[]{"cmd", "/c", dateiName},
null, new File(dateiAblage));
p.waitFor();
System.out.println(Thread.activeCount());
} finally {
FMessage meldung = new FMessage();
meldung.setLabelText("finally Runtime");
meldung.setVisible(true);
}
}
} catch (SQLException | InterruptedException | IOException ex) {
ex.printStackTrace();
}
}
}
[/Java]