私はどうやらそれをやったようで、どうすればいいのかわかりません。またはなぜ...または正確にはどちらか。
セットアップは次のとおりです。
OpenDSSEngine.dll と、このプロセスによって生成された com4j Java インターフェイスを使用して、OpenDSS シミュレーションを実行しています: https://com4j.java.net/tutorial.html
OpenDSS サーバーを別のマシンで実行できるようにする必要があったため、Java でクライアント/サーバー (テキストとオブジェクトの転送) を実装しましたが、すべて問題ありませんでした...
今、私は「ワークステーションモード」を実行できるようにしたいと考えていました(アプリケーションでローカルおよび直接comを呼び出します)。さらに、私はそれを少しスレッド化したかった. そこで、ランナー (関数を呼び出すスレッド) とラッパー (結果の処理を含むランナーからの関数呼び出しを処理する) を作成しました。
ラッパーには、クライアント側 (ソケット通信) またはサーバー側 (ワークステーション モード、com オブジェクト) の実装となる抽象クラスの実装が含まれています。
そして今問題:
大規模な編集:
さらにテストを重ねた結果、正確な問題がどこにあるのかをより正確に説明できるようになりました。
COM インターフェイスを開始すると、ファイル IO が壊れます。作業ディレクトリが何らかの形で変更されました。悪い意味で。すべての Java 関数を呼び出すと、あるべき作業ディレクトリが判明します。ここでJavaを実行しました。
しかし、何らかの理由で作業ディレクトリは、dll がデータを格納する場所です。
ファイルの1つをそこに置き、そこから読み取ろうとすることで、これを確認しました(変更、最初の文字を参照)。
コード:
// working dirs
Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);
String current;
try {
current = new java.io.File(".").getCanonicalPath();
System.out.println("Current dir:" + current);
} catch (IOException e2) {
e2.printStackTrace();
}
String currentDir = System.getProperty("user.dir");
System.out.println("Current dir using System:" + currentDir);
// try read java location
try {
BufferedReader in = new BufferedReader(new FileReader("1Neues_Netz_EXP_CAPACITY.csv"));
in.read();
in.close();
} catch (FileNotFoundException e) {
System.out.println("Failed: local creation");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Failed: local read");
e.printStackTrace();
}
// COM-Init
OpenDSS.IDSS DSS = ClassFactory.createDSS();
System.out.println("dssinit");
// working dirs, again
Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);
String current;
try {
current = new java.io.File(".").getCanonicalPath();
System.out.println("Current dir:" + current);
} catch (IOException e2) {
e2.printStackTrace();
}
String currentDir = System.getProperty("user.dir");
System.out.println("Current dir using System:" + currentDir);
// try read java location
try {
BufferedReader in = new BufferedReader(new FileReader("1Neues_Netz_EXP_CAPACITY.csv"));
in.read();
in.close();
} catch (FileNotFoundException e) {
System.out.println("Failed: local creation");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Failed: local read");
e.printStackTrace();
}
// try read COM location
try {
BufferedReader in = new BufferedReader(new FileReader("Neues_Netz_EXP_CAPACITY.csv"));
in.read();
in.close();
} catch (FileNotFoundException e) {
System.out.println("Failed: dss creation");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Failed: dss read");
e.printStackTrace();
}
結果:
Current relative path is: D:\Feustel\Aufträge\OROP\source\04 - Products\OROP
Current dir:D:\Feustel\Aufträge\OROP\source\04 - Products\OROP
Current dir using System:D:\Feustel\Aufträge\OROP\source\04 - Products\OROP
java.io.FileNotFoundException: 1Neues_Netz_EXP_CAPACITY.csv (Das System kann die angegebene Datei nicht finden)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileReader.<init>(Unknown Source)
at dev_tests.WorkstationModeTest2.main(WorkstationModeTest2.java:76)
dssinit
Current relative path is: D:\Feustel\Aufträge\OROP\source\04 - Products\OROP
Current dir:D:\Feustel\Aufträge\OROP\source\04 - Products\OROP
Current dir using System:D:\Feustel\Aufträge\OROP\source\04 - Products\OROP
Failed: local creation
例外の 76 行目は、dss の初期化後のものです。それはあなたのためのJavaです;)
ここに、私が使用したすべての com および opendss ファイルへのリンクがあります。
これを com4j の開発者と opendss の開発者に提出します。
もちろん、それが com4j の問題なのか、opendss エンジンの問題なのか、誰かが教えてくれたら嬉しいです。そして、これを修正する簡単な方法があるかどうか.