Já tenho código funcional (porém não finalizado) de uma aplicação que irá utilizar o jetty embarcado. Ao iniciar a aplicação, eu coloco um ícone na bandeja do sistema para executar algumas operações.
Se o jetty for inicializado durante a execução do método run() tudo funciona corretamente, mas se eu clicar no menu “Parar Servidor” e depois inicializar tudo novamente no “Iniciar Servidor” o tray trava e não exibe mais o menu.
O mesmo acontece se eu não iniciar o jetty no método run() deixando para o usuário clicar no “Iniciar Servidor” na primeira execução do aplicativo.
Alguma idéia do que pode ser ?
Segue abaixo o código da classe principal e da classe que manipula o jetty.
package com.giulianisanches;
import com.giulianisanches.http.ServerHandler;
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
public class LocalBridge {
private Image image;
private TrayIcon trayIcon;
private ServerHandler bridgeHandler;
private PopupMenu popupMenu;
private void initComponents() {
bridgeHandler = new ServerHandler();
image = Toolkit.getDefaultToolkit().getImage("images/network.png");
popupMenu = new PopupMenu();
trayIcon = new TrayIcon(image, "JLocalBridge", popupMenu);
}
private void buildPopupMenu() {
MenuItem menuExit = new MenuItem("Sair");
MenuItem menuStart = new MenuItem("Iniciar servidor");
MenuItem menuStop = new MenuItem("Parar servidor");
menuExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
bridgeHandler.stopServer();
System.exit(0);
}
});
menuStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
bridgeHandler.startServer();
}
});
menuStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
bridgeHandler.stopServer();
}
});
popupMenu.add(menuStart);
popupMenu.add(menuStop);
popupMenu.add(menuExit);
}
public void run() {
if (SystemTray.isSupported()) {
initComponents();
SystemTray tray = SystemTray.getSystemTray();
try {
tray.add(trayIcon);
buildPopupMenu();
bridgeHandler.startServer();
} catch (AWTException ex) {
JOptionPane.showMessageDialog(null,
"Não foi possível adicionar o aplicativo na bandeja do sistema.");
}
} else {
JOptionPane.showMessageDialog(null,
"Não possui suporte a bandeja dom sistema.");
}
}
public static void main(String[] args) {
LocalBridge localBridge = new LocalBridge();
localBridge.run();
}
}
package com.giulianisanches.http;
import com.giulianisanches.servlets.FilePrint;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
public class ServerHandler {
private Server server;
private Context context;
public ServerHandler() {
server = new Server(8888);
context = new Context(server, "/", Context.SESSIONS);
addServlets();
}
private void addServlets() {
context.addServlet(new ServletHolder(new FilePrint()), "/file");
}
public void startServer() {
if (!server.isRunning()) {
try {
server.start();
server.join();
} catch (InterruptedException ex) {
Logger.getLogger(ServerHandler.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(ServerHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void stopServer() {
if (server.isRunning()) {
try {
server.stop();
} catch (Exception ex) {
Logger.getLogger(ServerHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}