# KomServer startet nicht



## Jastol (7. Jan 2013)

Hi,

ich sitze jetzt seit einigen Tagen an einem Problem für das Ich bisher keine Lösung finden konnte. Ich habe eine Art Kommunikationsserver mit Eclipse Juno programmiert, welcher Hl7 Nachrichten auswertet und in eine postgres Datenbank schreiben soll. In Eclipse funktioniert es auch wunderbar und Ich habe Ihn mit verschiedenen Testnachrichten gestartet. Nachdem Ich das ganze jetzt aber mit Maven zu einer jar gebaut habe funktioniert es nichtmehr. Ich bekomme zwar die Oberfläche der Applikation (Dort wird Port, Verbundungsanzahl, Logpfad eingetragen) wenn Ich aber auf meinen Start Button drücke passiert allerdings nichts. 

Hier der Code des ActionAdapters:

```
buttonListener = new ActionAdapter() {
			public void actionPerformed(ActionEvent e) {
				// Request a connection initiation
				if (e.getActionCommand().equals("start")) {
					LoggerUrl.getInstance().setUrl(loggerText.getText());
					if (portText.getText().compareTo("") != 0
							&& zeitText.getText().compareTo("") != 0
							&& verbindungText.getText().compareTo("") != 0) {
						orv = new OldRecordValidator(zeitText.getText());
						ms = new MessageServer(Integer.parseInt(portText
								.getText()), Integer.parseInt(verbindungText
								.getText()));
						orv.startServer();
						ms.startServer();
						startButton.setEnabled(false);
						stopButton.setEnabled(true);
						JOptionPane.showMessageDialog(null,
								"Server wird auf Port: " + portText.getText()
										+ " mit " + verbindungText.getText()
										+ " Verbindungen um geöffnet");
					} else
						JOptionPane
								.showMessageDialog(null,
										"Server konnte nicht gestartet werden. Bitte überprüfen Sie Ihre eingaben");
				}
				// Disconnect
				else {
					ms.stopServer();
					orv.stopServer();
					JOptionPane.showMessageDialog(null,
							"Der Server wurde beendet");
					startButton.setEnabled(true);
					stopButton.setEnabled(false);
				}
			}
		};
```
 Und hier der Message Server:

```
public class MessageServer {

	private int maxConnections;
	private int listenPort;
	private boolean aktiv;
	private List<ConnectionHandler> handlerThreads;
	private static final Logger logger = ApplicationLogger.getInstance();

	public MessageServer(int aListenPort, int maxConnections) {
		listenPort = aListenPort;
		this.maxConnections = maxConnections;
	
		handlerThreads = new ArrayList<ConnectionHandler>();
		logger.info("Server gestartet mit " + maxConnections
				+ " auf Port " + aListenPort);
		setUpConnectionHandlers();
	}

	private void acceptConnections() {
		Runnable serverRunnable = new Runnable()
		{
		    public void run()
		    {
		try {
			ServerSocket server = new ServerSocket(listenPort, 100);
			Socket clientSocket = null;
			while (aktiv == true) {
				clientSocket = server.accept();
				handleConnection(clientSocket);
			}server.close();
		} catch (BindException e) {
			logger.info("Unable to bind to port " + listenPort);
		} catch (IOException e) {
			logger.info("Unable to instantiate a ServerSocket on port: "
					+ listenPort);
		}    }
		};
		Thread serverThread = new Thread(serverRunnable);
		serverThread.start();
		
	}

	private void handleConnection(Socket connectionToHandle) {
		ConnectionHandler.processRequest(connectionToHandle);
	}

	private void setUpConnectionHandlers() {
		for (int i = 0; i < maxConnections; i++) {
			ConnectionHandler currentHandler = new ConnectionHandler();
			currentHandler.start(i);
			handlerThreads.add(currentHandler);

		}
	}

	public void startServer(){
		for (int i = 0; i < handlerThreads.size(); i++) {
			handlerThreads.get(i).start(i);
		}
		aktiv = true;
	
		acceptConnections();
	}
	public void stopServer() {
		this.aktiv = false;
		for (int i = 0; i < handlerThreads.size(); i++) {
			handlerThreads.get(i).interrupt();
			handlerThreads.get(i).stop();
				
		}logger.info("Server wurde gestoppt");
	}

}
```


Hoffe mir kann jemand nen Tipp geben  Vielen Dank für die Hilfe.


----------



## Bleiglanz (7. Jan 2013)

showMessageDialog ist in allen Zweigen, irgenwas wird doch wohl angezeigt?


----------



## Jastol (7. Jan 2013)

Bleiglanz hat gesagt.:


> showMessageDialog ist in allen Zweigen, irgenwas wird doch wohl angezeigt?



Nein der Dialog wird nicht aufgerufen und die Tastenbelegung ändert sich auch nicht. Ich hab auch einen Client zu Testzwecken. Dieser erreicht den Server auch nicht, dass heißt der Port (Ich teste mit 8082) wird nicht von dem Server belegt.
Da es meine erste nicht Web Applikation ist bin Ich recht ratlos an was es noch liegen könnte. Gibt es in Java vll eine Möglichkeit in die laufende Applikation einen Debugger einzubauen?

Hier mal die komplette Gui:

```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;

import javax.swing.*;
import javax.swing.text.DateFormatter;

import logger.LoggerUrl;

import communication.MessageServer;
import database.OldRecordValidator;

public class Gui extends JFrame {
	private JButton startButton;
	private JButton stopButton;
	private JPanel ueberschrift;
	private JPanel eingabePanel;
	private JPanel buttonPanel;
	private JLabel communicationLabel;
	private JLabel portLabel;
	private JLabel verbindungLabel;
	private JLabel zeitLabel;
	private JLabel loggerLabel;
	private JLabel text1;
	private JLabel text2;
	private JLabel text3;
	private JLabel text4;
	private JLabel text5;
	private JFormattedTextField portText;
	private JFormattedTextField verbindungText;
	private JFormattedTextField zeitText;
	private JTextField loggerText;
	private JLabel empty;
	private JButton logger;
	private JFileChooser fileChooser;
	private OldRecordValidator orv;
	private MessageServer ms;
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public Gui() {
		super("Kommandooberfläche Infect");
		setLocation(600, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new BorderLayout(5, 5));
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
		DateFormatter df = new DateFormatter(sdf);
		ActionAdapter buttonListener = null;
		fileChooser = new JFileChooser();
		fileChooser.setFileFilter(new MyFileFilter(".txt"));

		// JPanel
		eingabePanel = new JPanel(new GridLayout(5, 5));
		ueberschrift = new JPanel(new GridLayout(7, 1));
		buttonPanel = new JPanel(new GridLayout(1, 2));

		// JButton
		buttonListener = new ActionAdapter() {
			public void actionPerformed(ActionEvent e) {
				// Request a connection initiation
				if (e.getActionCommand().equals("start")) {
					LoggerUrl.getInstance().setUrl(loggerText.getText());
					if (portText.getText().compareTo("") != 0
							&& zeitText.getText().compareTo("") != 0
							&& verbindungText.getText().compareTo("") != 0) {
						orv = new OldRecordValidator(zeitText.getText());
						ms = new MessageServer(Integer.parseInt(portText
								.getText()), Integer.parseInt(verbindungText
								.getText()));
						orv.startServer();
						ms.startServer();
						startButton.setEnabled(false);
						stopButton.setEnabled(true);
						JOptionPane.showMessageDialog(null,
								"Server wird auf Port: " + portText.getText()
										+ " mit " + verbindungText.getText()
										+ " Verbindungen um geöffnet");
					} else
						JOptionPane
								.showMessageDialog(null,
										"Server konnte nicht gestartet werden. Bitte überprüfen Sie Ihre eingaben");
				}
				// Disconnect
				else {
					ms.stopServer();
					orv.stopServer();
					JOptionPane.showMessageDialog(null,
							"Der Server wurde beendet");
					startButton.setEnabled(true);
					stopButton.setEnabled(false);
				}
			}
		};

		startButton = new JButton("Kommunikation Starten");
		startButton.setActionCommand("start");
		startButton.addActionListener(buttonListener);
		startButton.setEnabled(true);
		stopButton = new JButton("Kommunikation Stoppen");
		stopButton.setActionCommand("stop");
		stopButton.addActionListener(buttonListener);
		stopButton.setEnabled(false);
		logger = new JButton("Pfad waehlen");
		logger.addActionListener(new OpenAction());
		logger.setEnabled(true);

		// JLabel
		communicationLabel = new JLabel("Kommunikations Oberfläche");
		portLabel = new JLabel("Port Nummer: ");
		verbindungLabel = new JLabel("Max. Verbindungen: ");
		zeitLabel = new JLabel("Uhrzeit für Löschung: ");
		loggerLabel = new JLabel("Pfad für Log-Datei");
		text1 = new JLabel(
				"Bitte geben Sie einen freien Port an in dem Ihre Nachrichten von einem externen Kommunikationsserver ankommen");
		text2 = new JLabel(
				"und die Anzahl der gleichzeitig zu verarbeitenden Verbindungen.(Es dürfen hierbei nur Zahlen eingetragen werden).");
		text3 = new JLabel(
				"Bitte geben Sie auch eine Uhrzeit für das Löschen veralteter Datensätze im Format hh:mm ein.");
		text5 = new JLabel(
				"Als letztes muss noch der Pfad eingegeben werden in dem die Log-Datei Hinterlegt wird");
		text4 = new JLabel("");
		// JTextField
		NumberFormat intForm = NumberFormat.getNumberInstance();
		intForm.setGroupingUsed(false);
		portText = new JFormattedTextField(intForm);
		verbindungText = new JFormattedTextField(intForm);
		zeitText = new JFormattedTextField(df);
		empty = new JLabel("");
		loggerText = new JTextField(20);
		loggerText.setEditable(false);

		// Panel einsetllen
		buttonPanel.add(startButton);
		buttonPanel.add(stopButton);
		ueberschrift.add(communicationLabel);
		ueberschrift.add(text4);
		ueberschrift.add(text1);
		ueberschrift.add(text2);
		ueberschrift.add(text3);
		ueberschrift.add(text5);
		eingabePanel.add(portLabel);
		eingabePanel.add(portText);
		eingabePanel.add(verbindungLabel);
		eingabePanel.add(verbindungText);
		eingabePanel.add(zeitLabel);
		eingabePanel.add(zeitText);
		eingabePanel.add(loggerLabel);
		eingabePanel.add(logger);
		eingabePanel.add(empty);
		eingabePanel.add(loggerText);

		// Frame einstellen
		getContentPane().add(BorderLayout.SOUTH, buttonPanel);
		getContentPane().add(BorderLayout.NORTH, ueberschrift);
		getContentPane().add(BorderLayout.CENTER, eingabePanel);

		setResizable(false);
		pack();
		setVisible(true);
	}

	class OpenAction implements ActionListener {
		public void actionPerformed(ActionEvent ae) {
			// ... Open a file dialog.
			int retval = fileChooser.showDialog(Gui.this,
					"Bitte Datei für Logger wählen");
			if (retval == JFileChooser.APPROVE_OPTION) {
				// ... The user selected a file, get it, use it.
				File file = fileChooser.getSelectedFile();

				// ... Update user interface.
				loggerText.setText(file.getAbsolutePath());
			}
		}
	}
}
```

Hab den Dialog mal vor 
	
	
	
	





```
if (portText.getText().compareTo("")
```
 gezogen. Hier wird er aufgerufen, also es geht auf jeden Fall bei  
	
	
	
	





```
if (e.getActionCommand().equals("start"))
```
 rein, aber scheint die Threats nicht zu starten.


----------



## Jastol (7. Jan 2013)

Hab jetzt noch etwas rumprobiert und es scheint definitiv daran zu liegen dass dieser Programmcode nicht ausgeführt wird:

```
orv = new OldRecordValidator(zeitText.getText());
						ms = new MessageServer(Integer.parseInt(portText
								.getText()), Integer.parseInt(verbindungText
								.getText()));
						
						orv.startServer();
						ms.startServer();
						startButton.setEnabled(false);
						stopButton.setEnabled(true);
```

Ich weiß nur nicht warum, da es ja wie gesagt in Eclipse funktioniert. In der POM.xml werden auch eigentlich alle benötigten Libarys importiert.

Prinzipiell muss es an der Klasse MessageServer liegen. Ich hab jetzt etwas mit auskommentieren rumexperimentiert und wenn Ich den Klassenaufruf und die start() auskommentiere funktioniert es.


----------



## Jastol (7. Jan 2013)

Fehler gefunden. Die log4j war nicht richtig initialisiert.


----------

