質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1173閲覧

Javaでファイル転送 転送先不在時処理待ちが発生

zon

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2021/08/23 11:42

編集2021/08/24 03:27

プログラム移行(C#→Java)の中で処理待ちする事象が発生しています。
処理待ちを解消する方法を探しています。

WindowsServer2019
Java
Spring boot

C#(他社で開発)で実現しているある処理の中で2台のサーバにファイル転送する部分があります。システム更改に伴い、javaに移行しています。
Windowsのファイル共有でファイルコピーしています。

問題は、転送先サーバが停止していた場合、java上1ファイルで6分ほど待ちが発生します。Windows上の「ファイルを指定して実行」でネットワークパスを入力して接続しようとすると応答が返ってこないので、それに引っ張られて待ちが発生しているようです。
現行プログラム開発時のテストエビデンスを見ると、存在しないネットワークパスを転送先にするケースでもスムーズに処理されています。
ソースを見るとWNetAddConnection2というAPIを使用しています。これが都合よくネットワークの疎通確認を実施してくれているようです。

複数のサーバに転送処理を直列で行っており、待ちが発生すると後続の処理がその分遅延します。これが問題になっています。

知りたいのは、Javaの世界で、WNetAddConnection2同等の疎通確認を行う方法です。
疎通確認を非同期で行うという案はありますが、開発に費用が発生するので、できればやりたくありません。
良い案ないでしょうか。ご教示よろしくお願いします。

(8/24追記)
ソースコードは、以下になります。
for (String FilePath : FilePaths) {
File folder = new File(FilePath);
File file = new File(FilePath + "" + job.getid() + ".wav");
try (FileOutputStream fileOutputStream = new FileOutputStream(file);) {
if (!file.exists()) {
folder.mkdirs();
file.createNewFile(); }
fileOutputStream.write(bytes);
} catch (Exception e) {
logger.info("Exception:", e);
logger.error(messageSource.getMessage("E-VRFS-005", new String[] { "ファイル転送失敗", job.getid() }, Locale.JAPAN)); } }

発生する例外は、以下です。
java.io.FileNotFoundException

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/08/23 12:07

> 転送先サーバが停止していた場合、java上1ファイルで6分ほど待ちが発生します その転送に関する部分のコードをご提示願えますか。
zon

2021/08/23 12:18

以下になります。 for (String FilePath : FilePaths) { File folder = new File(FilePath); File file = new File(FilePath + "\\" + job.getid() + ".wav"); try (FileOutputStream fileOutputStream = new FileOutputStream(file);) { if (!file.exists()) { folder.mkdirs(); file.createNewFile(); } fileOutputStream.write(bytes); } catch (Exception e) { logger.info("Exception:", e); logger.error(messageSource.getMessage("E-VRFS-005", new String[] { "ファイル転送失敗", job.getid() }, Locale.JAPAN)); } }
jimbe

2021/08/23 15:25 編集

あっと、すいません、ご質問を編集して追加する感じでお願いします。 ついでですが、"ファイル転送失敗" 時のログに出てくる例外はどのようなものかもお願いします。
jimbe

2021/08/23 16:52 編集

非常にざっくりですが、java で即 Windows のファイル共有の停止状態を検出する方法の記事は見つけられていません。 (恐らく zon さんも散々お探しになったこととは思いますが。) 他にあるとすれば、オープンな CIFS(SMB) クライアントを入れて直接ネットワーク経由で共有にアクセスする形にするということでしょうか。 これもどこまで素早く検出出来るか分かりませんし、「疎通確認を非同期で行うという案はありますが、開発に費用が発生する」のをオープンソースの利用で誤魔化すような形になりますので、なんとも決りの悪い感じがしてしまいます。 どこかに JNI で WNetAddConnection2 を呼ぶようなモノがあれば・・・とも思っているのですが(==;
dodox86

2021/08/23 19:58

> どこかに JNI で WNetAddConnection2 を呼ぶようなモノがあれば・・・とも思っているのですが(==; たぶん、自力で作った方が早いでしょうね。C#での先のプロダクトがあるのでしょうし、そちらの主要な部分を模倣するのが目的を達するのに近道と思えます。
dodox86

2021/08/23 20:08

> 疎通確認を非同期で行うという案はありますが、開発に費用が発生するので、できればやりたくありません。 既にこのような質問、検討、つまりは作業工数がかかっていることになるし、どうせ何らかのコードは書かなければならないので、何か違和感がありますね。JavaでのファイルI/Oの下でSMBのやり取りが生じていて、それを無視して簡単な方法でと言われても、と言う感じもします。Windows上で動作しているJavaアプリであれば、"net use" コマンドの出力で判定できたりしませんでしょうか。
zon

2021/08/24 03:46

皆さんありがとうございます。取り急ぎ言い訳を。 dodox86さん >何か違和感がありますね。 おっしゃる通りですね。設計に影響するので、プログラムの構成を変えたくないからという意図でしたが、どのみち工数は発生するので同じですね。 hoshi-takanoriさんに頂いた情報をまず見てみようと思います。
guest

回答1

0

自己解決

最終的にファイル転送するまえに疎通確認のロジックを追加しました。
内容は、転送先ポート445に対してソケット作成できるかどうか。
タイムアウト値も設定して待ち時間を制御できるようにしました。
みなさんありがとうございました。

投稿2021/09/03 21:09

zon

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問