インターネットに接続してファイル(添付ファイル付きの電子メール、SSL、javamail)を送信するJavaプログラムがあります。一度に1通のメールのみを送信します。
プログラム自体が生成しているネットワークトラフィックを追跡する方法はありますか?そうすれば、送信されているメールの進行状況を追跡できます...
それがクロスプラットフォームソリューションだったら、それもいいでしょう...
インターネットに接続してファイル(添付ファイル付きの電子メール、SSL、javamail)を送信するJavaプログラムがあります。一度に1通のメールのみを送信します。
プログラム自体が生成しているネットワークトラフィックを追跡する方法はありますか?そうすれば、送信されているメールの進行状況を追跡できます...
それがクロスプラットフォームソリューションだったら、それもいいでしょう...
別のユーザーのアプローチは次のとおりです 。JavaメールでのJProgressBarの使用(transport.send()後の進行状況を知る)
下位レベルでは、送信されているバイト数を監視する場合は、ラップされたInputStreamsを生成するSocketsとそれらを通過するデータの量を監視するOutputStreamsを生成する独自のSocketFactoryを作成できる必要があります。これは少し手間がかかり、おそらく実際に必要なレベルよりも低いレベルですが、別のアプローチです。
私はしばらくの間、これを自分でやろうと思っていましたが、まだそのラウンドの授業を待っています... :-)
とにかく、ここでもう少し詳しく説明します。入ってみるとわからない落とし穴があるかもしれません...
独自の SocketFactory クラスを作成する必要があります。JavaMail SSLNOTES.txt ファイルには、別のファクトリに委任して作業を行う簡単な例があります。factory.createSocket(...) の代わりに、「new MySocket(factory.createSocket(...))」を使用する必要があります。ここで、MySocket は、渡された Socket にデリゲートするすべてのメソッドをオーバーライドする作成するクラスです。コンストラクター。getInputStream および getOutputStream メソッドを除いて、同様のアプローチを使用して、返されたストリームを自分で作成したストリーム クラスでラップする必要があります。これらのストリーム クラスは、すべての読み取りメソッドと書き込みメソッドをオーバーライドして、転送されるデータの量を追跡し、進行状況を監視したいコードでその情報を利用できるようにする必要があります。監視したい操作を行う前に、カウントをリセットします。その後、操作が進行するにつれて、カウントが更新されます。何それ操作を完了するために送信する必要がある低レベルのデータの量がわからないため、「完了率」の測定値は得られません。
メッセージの送信にのみ機能する別のアプローチを次に示します...
送信されるメッセージのデータは、Message.writeTo メソッドによって生成され、ソケットから直接送信されるさまざまなストリームを通じてフィルター処理されます。MimeMessage をサブクラス化し、writeTo メソッドをオーバーライドし、そこを流れるデータをカウントする独自の OutputStream で OutputStream をラップし (私の他の提案と同様)、それをプログラムに報告することができます。コードで...
public class MyMessage extends MimeMessage {
...
public void writeTo(OutputStream os, String[] ignoreList) throws IOException, MessagingException {
super.writeTo(new MyCountingStream(os), ignoreList);
}
}
完了率が必要な場合は、最初に Message.writeTo を使用して、データを破棄しながら、書き込まれるデータの量をカウントするだけのストリームにメッセージを書き込むことができます。次に、メッセージが実際にどれだけ大きいかがわかるので、メッセージが送信されているときに、それがメッセージの何パーセントであるかがわかります。
それが役立つことを願っています...