Java アプリケーションを Windows サービスとして Windows 7 (32 ビット) OS にインストールしました。私のアプリケーションは、サービスの開始時に通知領域に java.awt.TrayIcon を表示することが期待されています。しかし、それはアイコンを表示していません。同じアプリケーションが Windows XP で正常に動作しています。誰でもそれについて何か考えがありますか?
2 に答える
Windows 上のサービスはグラフィカルではありません。ユーザーがログインせずに実行されているためです。サービスを管理するためのトレイ アイコンとグラフィカル ウィンドウが必要な場合は、サービスと通信する別のプログラム (ローカル ネットワーク、dcom など) を作成し、このプログラムをセッションのスタートアップに追加する必要があります。(そのようにして、コンピューターで独自のJavaサービスを実行しました)。
わかりました、私は Windows Server 2003 で作業しました。Windows 2003 以降、サービスに GUI を使用できないのでしょうか?
あなたが開発しなければならないコードは、あなたが望むものに依存しますか? サービスプロセスがまだ実行されていることを監視するためのトレイアイコンがありますか?システムトレイをクリックしたときにパラメーターウィンドウを表示しますか?...
サービスがまだ実行され、応答していることを監視するための簡単なコード (コードを明確にするための例外管理なし) を用意しました (これは標準の Java コードであり、特別な lib は必要ありません)。
systray プログラム:
//if any Exception --> ERROR CODE
Socket socket = new Socket("localhost", 25146);
DataOutputStream outToServer = new DataOutputStream(socket.getOutputStream());
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
outToServer.writeBytes("ping\n");
//Wait maximum 5s to have an answer from the service
for (int i = 0; inFromUser.ready() == false && i < 5; ++i) {
Thread.sleep(1000);
}
if (inFromUser.ready() == false) {
//ERROR CODE (change systrat icon, display balloon tooltip,...)
} else {
pong = inFromUser.readLine();
//Check the answer
}
//Check only every second (don't flood yout computer ;))
Thread.sleep(1000);
}
inFromUser.close();
outToServer.close();
socket.close();
サービス プログラム コード:
ServerSocket socket = new ServerSocket(this._port);
while (true) {
Socket connection = socket.accept();
Thread thread = new Thread(new Runnable {
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connection.getOutputStream());
Scanner scanner = new Scanner(inFromClient);
while (scanner.hasNextLine()) {
outToClient.writeBytes(scanner.nextLine());
}
inFromClient.close();
outToClient.close();
connection.close();
});
thread.start();
}
パラメーター ウィンドウをポップアップ表示する場合は、systray プログラムで GUI を書き込み、結果をパラメーター ファイルに書き込み、サービスに特別なキーワードを送信してパラメーター ファイルをリロードするか、または次のいずれかを試すことができます。 GUI をサービスに直接送信し、特別なキーワードを送信し、jframe.setVisible(true) を実行して、現在のセッションに表示されることを願っています... :)
Microsoftは、インタラクティブサービスの動作を2006年に変更しました。WindowsNT、XP、およびServer 2003で機能していたものは、「Session 0 Isolation」のおかげで、Vista、7、またはServer2008では機能しなくなりました。
詳細はこちら: