Programm frisst 'Virtuellen Speicher' wie PacMan

ralphq

Neues Mitglied
Servus miteinander,

ich bin neu in dem Forum. Ich schreibe gerade an meiner Abschlussarbeit und hänge seit einiger Zeit an einem Problem.

Meine Aufgabe ist es, ein 'Fraud Detection' Framework für eine Telekommunikations Unternehmung zu erstellen.
Das Framework liest alle Telefontickets ein (Ticket = informationen zu einem Telefonat) und speichert diese in einer Datenbank via Hibernate als Objekt ab.
Dieser Vorgang arbeitet als eigener Thread.

Weiter sollen in das Framework Module eingesetzt werden, die nach Betrugsmuster prüfen.
Diese Module werden von einem Scheduler angestoßen (auch ein eigener Thread).

Das Framework soll permanent laufen.



Problemstellung:

Ich lasse das Framework momentan übernacht (oder länger) laufen um es zu testen. Dabei ist mir folgendes aufgefallen.
Der Verbrauch des 'Virtuellen Speichers' klettert unaufhörlich in die Höhe. Nach einer Nacht reserviert mein Programm 20GB Virtuellen Speicher im System.
Nach 3 Nächten 70GB Virtueller Speicher.
Der Heap Speicher Verbrauch bleibt dabei relativ konstant bei ca. 100MB - 200MB.
Beobachtet mit 'Jconsole' und 'htop' bzw 'top'.

Das Programm läuft auf einer Debian6 VM mit einer 10GB Partition, 500MB RAM und 500MB Swap.
-> Da stellt sich mir schon mal die Frage, wo nimmt die JavaVM den Speicher überhaupt her?

Ich vermute das Problem hängt mit dem einlesen der Tickets (FileStreamerThread.java) oder mit der Hibernate DB Anbindung zusammen...
Leider bin ich langsam mit meinem Latein am Ende...

Würde mich über jedern Tipp oder Rat freuen!!

Der Code ist leider etwas unleserlich, ich bitte das zu entschuldigen. :)

Klasse: FileStreamerThread.java (liest die Tickets ein)
Java:
public class FileStreamerThread extends Thread {

	private static Logger logger = Logger.getLogger(FileStreamerThread.class);
	private static SystemProperties sysProps = SystemProperties.getInstance();
	private Framework framework = new Framework();
	private static FileStreamerThread instance = null;
	/** Befehl zum auslesen des System-Änderungsdatums einer Datei. */
	String[] cmd = {
			"bash",
			"-c",
			"ls -l " + sysProps.getTicketfile().getAbsolutePath()
					+ " | grep grnti | awk \'{print $8}\'" };
	/** Flag zum sauberen beenden des Threads */
	volatile boolean stop = false;

	/** Daten fuer das Input File */
	FileInputStream fis = null;
	DataInputStream dis = null;
	BufferedReader br = null;
	File file = sysProps.getTicketfile();
	private String file_age = null;

	/** SINGELTON! */
	public static FileStreamerThread getInstance() {
		if (instance == null)
			instance = new FileStreamerThread();
		return instance;
	}

	/**
	 * Wird benötigt, wenn der FileStream Thread vom Benutzer via Frontend neu
	 * gestartet wird.
	 */
	public void destroyFileStreamerThread() {
		instance = null;
	}

	/**
	 * Inititalisiert den Dateizugriff
	 * 
	 * @return true wenn erfolgreich
	 */
	public boolean setupReader() {
		try {
			fis = new FileInputStream(file);
			dis = new DataInputStream(fis);
			br = new BufferedReader(new InputStreamReader(dis));

			try {
				Process proc = Runtime.getRuntime().exec(cmd);
				BufferedReader in = new BufferedReader(new InputStreamReader(
						proc.getInputStream()));
				file_age = in.readLine();
				logger.info("Fileage set to: " + file_age);
			} catch (IOException e) {
				logger.warn("Could not set FileAge!");
				return false;
			}
			return true;
		} catch (FileNotFoundException e1) {
			logger.error("Konnte die TicketDatei \'"
					+ sysProps.getTicketfile().getAbsolutePath()
					+ "\' nicht öffnen.");
			if (!file.exists())
				logger.error("Die TicketDatei \'"
						+ sysProps.getTicketfile().getAbsolutePath()
						+ "\' existiert nicht.");
			return false;
		}
	}

	/**
	 * Schließt den Dateizugriff
	 */
	public void shutdownReader() {
		try {
			br.close();
			dis.close();
			fis.close();
			br = null;
			dis = null;
			fis = null;
		} catch (IOException e) {
			logger.error("Die Ticketdatei \'"
					+ sysProps.getTicketfile().getAbsolutePath()
					+ "\' konnte nicht geschlossen werden.");
		}
	}

	/**
	 * Endlosschleife: Läuft als eigener Thread und überwacht/liest ständigt die
	 * Ticketdatei.
	 * 
	 */
	public void run() {

		/** buffert die einzelnen Elemente eines Tickets */
		String[] curTickElements = null;
		/** beinhaltet das letzte Element im Ticket */
		int finalField = -1;
		/** Ticket als String in Rohform */
		String str = "";

		if (setupReader()) {
			/** FileZugriff erfolgreich... */
			System.out.println("Starting Filestream.");
			while (!stop) {
				try {

					if ((str = br.readLine()) != null) {
						/** Trennt das Ticket in die einzelnen Elemente auf */
						curTickElements = str.split(" ");
						/** Definiert die Länge es Tickets */
						finalField = curTickElements.length - 1;
						if (curTickElements[0].contains("GO")) {
							/** Aus Ausgehende Tickets sollen behandelt werden */
							framework.cutRawTicket(finalField, curTickElements);
						}
					}
				} catch (ArrayIndexOutOfBoundsException ae) {
					logger
							.debug("Ticket konnte nicht verarbeitet werden. Zu wenig Felder. ["
									+ finalField + " Felder] \n" + str);
				} catch (IOException e) {
					logger.error("Fehler bei Zugriff auf die Ticketdatei \'"
							+ sysProps.getTicketfile() + "\'.");
				} catch (Exception e) {
					logger
							.debug("Unbekannter Fehler beim Verarbeiten des Tickets \'"
									+ str
									+ "\'. ("
									+ finalField
									+ ")\n"
									+ e.toString() + "\n");
				}

				/**
				 * Erneuerung des Dateizugriffs (Ticketdatei). Ist der
				 * Filestream NULL und der thread aktiv (!stop), wird geprüft ob
				 * sich die erstellungszeit der Datei verändert hat 'file_age'.
				 * Wenn ja, erfolgt eine Erneuerung.
				 * 
				 */
				try {
					if ((!br.ready()) && (!stop)) {
						try {
							Process proc = Runtime.getRuntime().exec(cmd);
							BufferedReader in = new BufferedReader(
									new InputStreamReader(proc.getInputStream()));

							String current_file_Age = "X"; // Init variable
							current_file_Age = in.readLine();
							if (!file_age.contains(current_file_Age)) {
								logger.info(file_age + " != "
										+ current_file_Age);
								setupReader();
								logger
										.info("Zugriff auf die Ticketdatei erfolgreich erneuert \'"
												+ sysProps.getTicketfile()
														.getAbsolutePath()
												+ "\'");
							}

						} catch (NullPointerException npe) {
							logger
									.error("Das Dateialter der Ticketdatei konnte nicht ermittelt werden. NullpointerException!\nDateizugriff wird erneuert");
							setupReader();
						}

						catch (IOException e) {
							logger
									.error("Das Dateialter der Ticketdatei konnte nicht ermittelt werden. IOException!\nDateizugriff wird erneuert");
							setupReader();
						}

					}
				} catch (IOException e) {
					logger
							.error("Schwerwiegender Fehler beim Erneuern des Zugriffs auf die Ticketdatei \'"
									+ sysProps.getTicketfile()
											.getAbsolutePath()
									+ "\'\n"
									+ e.toString());
					setupReader();
				}
			}
		}
	}
}

Klasse: Scheduler.java (Startet die Module)

Java:
public class Scheduler extends Thread {

	private static Scheduler instance = null;
	private SystemProperties sysProps = SystemProperties.getInstance();
	private static HashMap<String, String> moduleNameAndTiming = new HashMap<String, String>();
	private static Logger logger = Logger.getLogger(Scheduler.class);
	private static String namespace = "de.rkom.frauddetection.modules.";
	/** Flag zum sauberen beenden des Threads */
	volatile boolean run = true;

	private String[] module = null;

	private SchedulerFactory sf = null;
	private org.quartz.Scheduler sched = null;

	/** Classic Singelton Pattern */
	public static Scheduler getInstance() {
		if (instance == null) {
			instance = new Scheduler();
		}
		return instance;
	}

	public void run() {
		try {
			getModules();
			schedule();
			while (run) {
				// Control Schleife
				// System.out.println("Scheduler running: " +
				// sched.isStarted());
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void schedule() throws SchedulerException {
		sf = new StdSchedulerFactory();
		sched = sf.getScheduler();
		logger.info("------- Initializing ----------------------");
		/** First we must get a reference to a scheduler */

		logger.info("------- Initialization Complete -----------");
		/** nächste volle Minute berechnen */
		Date runTime = evenMinuteDate(new Date());
		logger.info("------- Scheduling Job  -------------------");

		/** Liste der Module verarbeiten */
		Iterator<?> iter = moduleNameAndTiming.entrySet().iterator();
		while (iter.hasNext()) {
			/**
			 * module[0] = <name> module[1] = <timing>
			 */
			module = iter.next().toString().split("=");
			/** timing 0=minütlich 1=stündlich */
			int timing = 0;
			/** Untersuche den Intervall. Minutliche oder Stündliche ausführung? */
			if (module[1].substring(module[1].length() - 1).contains("m"))
				timing = 1;
			else if (module[1].substring(module[1].length() - 1).contains("h"))
				timing = 2;
			else
				logger.warn("Ungueltiges Intervall \'" + module[1]
						+ "\' Intervall fuer das Modul \'" + module[0]
						+ "\' nicht setzen. > Modul nicht aktiviert.");
			/** Standard: Deaktiviert */
			int intervall = 0;
			try {
				intervall = Integer.valueOf(module[1].substring(0, module[1]
						.length() - 1));
			} catch (Exception e) {
				logger.warn("Konnte das Intervall fuer das Modul \'"
						+ module[0]
						+ "\' nicht setzen. > Modul nicht aktiviert.");
			}
			/** Intevall 0 bedeutet, modul ist deaktiviert */
			if (intervall > 0) {
				/** Modulklassen instanzieren und den Trigger definieren */
				Class<? extends Job> moduleClass;
				try {
					moduleClass = (Class<? extends Job>) Class
							.forName(namespace + module[0]);
					JobDetail job = newJob(moduleClass).withIdentity(module[0],
							"group1").build();

					Trigger trigger = null;
					if (timing == 1) {
						System.out.println("\nInitialisiere das Modul \'"
								+ module[0]
								+ "\' im Intervall \'"
								+ module[1]+ "\', zur naechsten vollen Minute ");

						/** Trigger minütlich definieren */
						trigger = newTrigger()
								.startAt(runTime)
								.forJob(job)
								.withSchedule(
										SimpleScheduleBuilder
												.repeatMinutelyForever(intervall))
								.build();

					} else if (timing == 2) {
						System.out.println("\nInitialisiere das Modul \'"
								+ module[0]
								+ "\' im Intervall \'"
								+ module[1]	+ "\', zur naechsten vollen Minute ");

						/** Trigger stündlich definieren */
						trigger = newTrigger()
								.startAt(runTime)
								.forJob(job)
								.withSchedule(
										SimpleScheduleBuilder
												.repeatHourlyForever(intervall))
								.build();
					}
					/** Schedule erstellen mit Trigger */
					sched.scheduleJob(job, trigger);

				} catch (ClassNotFoundException e) {
					logger.error("Konnte die Klasse \'" + namespace + module[0]
							+ "\' nicht finden.\nModul wird uebersprungen");
				} catch (SchedulerException e) {
					logger.error("Fehler beim schedulen des Jobs \'"
							+ namespace + module[0] + "\'\n");
					e.printStackTrace();
				}
				/** Output ausgeschaltete Module */
			} else if (intervall == 0) {
				System.out.println("Modul \'" + module[0]
						+ "\' in Konfig deaktiviert.");
			}

			/** Scheduler starten */
			try {
				sched.start();
				logger.info("------- Started Scheduler -----------------");
			} catch (SchedulerException e) {
				logger.error("------- !Scheduler ERRORED!-----------------");

			}
		}
	}
}


Klasse: HibernateUtil.java ( Steuert die DB Verbindung )

Java:
public class HibernateUtil {

	/**
	 * @param args
	 */
	private static final SessionFactory sessionFactory = buildSessionFactory();
	private static SystemProperties sysProps = null;

	public static SessionFactory buildSessionFactory() {
		try {
			return configureHibernateConnection().buildSessionFactory();
		} catch (HibernateException ex) {
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		sessionFactory.openSession();
		return sessionFactory;
	}

	public static Session getSession(){
		Session s = sessionFactory.openSession();
		return s;
	}

	public static Configuration configureHibernateConnection()  {
		
		sysProps = SystemProperties.getInstance();
		Configuration cfg = new Configuration();
		cfg.addClass(de.rkom.frauddetection.persistence.TicketObject.class);
		cfg.addClass(de.rkom.frauddetection.persistence.ContractData.class);
		int i = 0;
		
		cfg.setProperty("hibernate.transaction.factory_class",
				"org.hibernate.transaction.JDBCTransactionFactory");
		cfg.setProperty("connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider" );
		cfg.setProperty("c3p0.minPoolSize", "40" );
		try {
			cfg.setProperty("hbm2ddl.auto", sysProps.getHib_hbm2ddl_auto());
		} catch (NullPointerException e) {
			System.out
					.println("Konnte den Wert \'hbm2ddl.auto\' der Hibernate Konfiguration nicht setzen. Pruefen Sie die \'fraudConfig\'");
			cfg.setProperty("hbm2ddl.auto", "update");
			i++;
		}
		
		try {
			cfg.setProperty("show_sql", sysProps.getHib_showSql());
		} catch (NullPointerException e) {
			cfg.setProperty("show_sql", "false");
			i++;
		}
		try {
			cfg.setProperty("current_session_context_class", sysProps
					.getHib_sessionContextClass());
		} catch (NullPointerException e) {
			cfg.setProperty("current_session_context_class", "thread");
			i++;
		}
		try {
			cfg.setProperty("cache.provider_class", sysProps
					.getHib_providerClass());
		} catch (NullPointerException e) {
			cfg.setProperty("cache.provider_class",
					"org.hibernate.cache.NoCacheProvider");
			i++;
		}
		try {
			cfg.setProperty("connection.pool_size", sysProps.getHib_poolsize());
		} catch (NullPointerException e) {
			cfg.setProperty("connection.pool_size", "10");
			i++;
		}
		try {
			cfg.setProperty("hibernate.connection.password", sysProps
					.getHib_pass());
		} catch (NullPointerException e) {
			cfg.setProperty("hibernate.connection.password", "postgres");
			i++;
		}
		try {
			cfg.setProperty("hibernate.connection.username", sysProps
					.getHib_user());
		} catch (NullPointerException e) {
			cfg.setProperty("hibernate.connection.username", "fraudy");
			i++;
		}
		try {
			cfg.setProperty("hibernate.connection.url", sysProps.getHib_url());
		} catch (NullPointerException e) {
			cfg.setProperty("hibernate.connection.url",
					"jdbc:postgresql://localhost/postgres");
			i++;
		}
		try {
			cfg.setProperty("hibernate.connection.driver_class", sysProps
					.getHib_driver());
		} catch (NullPointerException e) {
			cfg.setProperty("hibernate.connection.driver_class",
					"org.postgresql.Driver");
			i++;
		}
		try {
			cfg.setProperty("hibernate.dialect", sysProps.getHib_dialect());
		} catch (NullPointerException e) {
			cfg.setProperty("hibernate.dialect",
					"org.hibernate.dialect.PostgreSQLDialect");
			i++;
		}
//		SchemaExport schemeExp = new SchemaExport(cfg);
//		schemeExp.execute(true, true, false, true);
//		schemeExp.create(true, true);
		cfg.buildMappings();
		return cfg;

	}
}

Klasse: FraudRepository.java (Stellt Funktionen für DB Zugriff zur Verfügung)

Java:
/**
 * Hibernate Fraud Repository
 * 
 * Stellt Funktionen zu verfügung um den Datenbankzugriff zu handeln.
 * 
 * @author ralph
 * 
 */
public class FraudRepository {

	private static Logger logger = Logger.getLogger(FraudRepository.class);

	public FraudRepository() {
	}

	public void deleteObject(Class<?> clazz, int key) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Object o = null;
		try {
			o = session.load(clazz, key);
			session.delete(o);
		} catch (RuntimeException e) {
			logger.warn("Konnte das Objekt \'" + key + "\' der Klasse \'"
					+ clazz + "\' nicht loeschen. Evtenuell nicht vorhanden? \n" );
		}
		session.close();
	}

	/**
	 * Speichert Objekte ab Aufruf vom FrameWork
	 * 
	 * @param o
	 */
	public void createAndStore(Object o) {
		Session session = null;
		try {
			session = HibernateUtil.getSession();
			session.beginTransaction();
			session.saveOrUpdate(o);
			session.getTransaction().commit();
		} catch (RuntimeException e) {
			logger.error("Konnte das Objekt <"+ o.getClass().toString() +"> nicht abspeichern \n"
					+ e.toString());
		} finally {
			// session.flush();
			session.close();
		}
	}

	/**
	 * Liefert alle Elemente der persistenten Klasse zurück
	 * 
	 * @param target
	 *            (from TicketObject)
	 * @return
	 */
	public List<?> listObjects(String target) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		List<?> result = session.createQuery(target).list();
		session.getTransaction().commit();
		// session.flush();
		session.close();
		return result;
	}

	/**
	 * Liefert das Objekt aus der Datenbank zurück
	 * 
	 * @param clazz
	 *            TicketObject oder CustomerData
	 * @param ID
	 *            > Vertragsnummer
	 * @return
	 */
	public Object getObjectById(Class<?> clazz, int ID) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Object o = null;
		try {
			o = session.get(clazz, ID);
		} catch (RuntimeException e) {
			logger.warn("Konnte das Objekt \'" + ID + "\' der Klasse \'"
					+ clazz + "\' nicht laden \n" + e.toString());
		}
		// session.flush();
		session.close();
		return o;
	}


	@SuppressWarnings("unchecked")
	public List<TicketObject> getAllTickets() {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		List<TicketObject> result = (List<TicketObject>) session
				.createCriteria(TicketObject.class).list();
		HibernateUtil.getSessionFactory().close();
		return result;
	}

	/**
	 * Löscht Tickets aus der Datenbank, die älter als 6 Monate sind.
	 */
	public void clearOldTickets() {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Query query = session
				.createSQLQuery("DELETE from TICKETS WHERE TIMESTAMP < (now() - ('6 month'::interval))");
		// session.flush();
		session.close();
	}

	/**
	 * Liefert Tickets des letzen Monats
	 * 
	 * @return
	 */
	public List getTicketsLastMonth() {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Query query = session
				.createSQLQuery("SELECT * from TICKETS WHERE TIMESTAMP > (now() - ('1 month'::interval))");
		// session.flush();
		List TicketList = query.list();
		session.close();
		return TicketList;
	}

	/**
	 * Liefert Tickets der letzten Woche
	 * 
	 * @return
	 */
	public List getTicketsLastWeek() throws Exception {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Query query = session
				.createSQLQuery("SELECT * from TICKETS WHERE TIMESTAMP > (now() - (\'1 week\'::interval))");
		List TicketList = query.list();
		session.close();
		return TicketList;
	}

	@SuppressWarnings("unchecked")
	public List<TicketObject> getTicketsByContract(int contract) {
		List<TicketObject> result = null;
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Criteria criteria = session.createCriteria(TicketObject.class);
		criteria.add(Restrictions.eq("rfonvertragid", contract));
		result = (List<TicketObject>) criteria.list();
		session.close();
		return result;
	}

	/**
	 * Selects all Tickets in the given period.
	 * 
	 * @param days
	 *            >> amount of days
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<TicketObject> getTicketsLastDays(int days) {

		List<TicketObject> result = null;
		Session session = HibernateUtil.getSession();
		Date now = new Date();
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, -days);
		Date low = new Date(cal.getTimeInMillis());
		session.beginTransaction();
		Criteria criteria = session.createCriteria(TicketObject.class);
		criteria.add(org.hibernate.criterion.Expression.ge("timestamp", low));
		criteria.add(org.hibernate.criterion.Expression.le("timestamp", now));
		result = criteria.list();
		session.close();
		return result;
	}

	/**
	 * Liefert alle Tickets zurück
	 * 
	 * @return
	 */
	public List<TicketObject> getTickets() {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Query query = session.createSQLQuery("SELECT * from TICKETS");
		List<TicketObject> TicketList = query.list();
		session.close();
		return TicketList;
	}

	/**
	 * Liefert das erste Ticket zurück. Aufruf für den Status aus der MAIN
	 * 
	 * @return
	 */
	public String getFirstTicket() {
		// Session session =
		// HibernateUtil.getSessionFactory().getCurrentSession();
		String result = null;
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Query query = session
				.createSQLQuery("SELECT timestamp from TICKETS LIMIT 1");
		// session.flush();
		result = query.list().toString();
		session.close();
		return result;
	}

	/**
	 * Liefert die Anzahl der Tickets zurück
	 * 
	 * @return
	 */
	public String getAmountTickets() {
		// Session session =
		// HibernateUtil.getSessionFactory().getCurrentSession();
		String result = null;
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Query query = session.createSQLQuery("SELECT COUNT(*) from TICKETS");
		result = query.list().toString();
		session.close();
		return result;
	}

}
 

Ariol

Top Contributor
  1. FileStreamerThread.java: File (Java Platform SE 6)
  2. FileStreamerThread.java: Warum erstellst du bei jedem
    Code:
    setupReader
    neue Reader, schließt diese aber nie. (
    Code:
    shutdownReader
    ) wird nirgends aufgerufen
  3. Scheduler.java: in leere While-Schleifen sollte ein Sleep. (10ms sollten reichen)

...und das waren nur die Sachen die beim Drüberfliegen aufgefallen sind...

EDIT: Zum Singelton-Pattern gehört auch immer ein privater Konstruktor.
 
Zuletzt bearbeitet:

Ariol

Top Contributor
Versuchs doch mal so:
Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Logger;

public class FileStreamerThread extends Thread {

	private static Logger logger = Logger.getLogger(FileStreamerThread.class);
	private static SystemProperties sysProps = SystemProperties.getInstance();
	private static FileStreamerThread instance = null;
	/** Befehl zum auslesen des System-Änderungsdatums einer Datei. */

	/** Flag zum sauberen beenden des Threads */
	volatile boolean stop = false;

	/** Daten fuer das Input File */
	private Framework framework;
	private File file;
	private long fileAge;

	/**
	 * Nur innerhalb dieser Klasse verwendbar -> SINGELTON
	 */
	private FileStreamerThread() {
		this.framework = new Framework();
		this.file = sysProps.getTicketfile();
		fileAge = 0;
	}

	/** SINGELTON! */
	public static FileStreamerThread getInstance() {
		if (instance == null)
			instance = new FileStreamerThread();
		return instance;
	}

	/**
	 * Wird benötigt, wenn der FileStream Thread vom Benutzer via Frontend neu
	 * gestartet wird.
	 */
	public void destroyFileStreamerThread() {
		instance = null;
	}

	/**
	 * Endlosschleife: Läuft als eigener Thread und überwacht/liest ständigt die
	 * Ticketdatei.
	 * 
	 */
	public void run() {

		while (!stop) {
			long currentAge = file.lastModified();
			if (currentAge <= fileAge) // Warte auf neuere Datei
			{
				sleep(100); // try again later
				continue;
			}
			fileAge = file.lastModified();
			FileReader in = null;
			BufferedReader br = null;
			String[] curTickElements = null;
			String line = null;
			try {
				in = new FileReader(file);
				br = new BufferedReader(in);
				while ((line = br.readLine()) != null) {
					/** Trennt das Ticket in die einzelnen Elemente auf */
					curTickElements = line.split(" ");

					/** Definiert die Länge es Tickets */
					if (curTickElements.length > 0)// nicht leer
					{
						if (curTickElements[0].contains("GO")) {
							/** Aus Ausgehende Tickets sollen behandelt werden */
							framework.cutRawTicket(curTickElements.length - 1,
									curTickElements);
						}
					} else {
						logger.debug("Ticket konnte nicht verarbeitet werden. Zu wenig Felder. ["
								+ curTickElements.length
								+ "] Felder] \n"
								+ line);
					}

				}
			} catch (IOException e) {
				logger.error("Fehler bei Zugriff auf die Ticketdatei \'"
						+ sysProps.getTicketfile() + "\'.");
			} catch (Exception e) {
				logger.debug("Unbekannter Fehler beim Verarbeiten des Tickets \'"
						+ line
						+ "\'. ("
						+ curTickElements.length
						+ ")\n"
						+ e.toString() + "\n");
			} finally {
				if (br != null)
					br.close();
				if (in != null)
					in.close();
			}
		}
	}
}
 

ralphq

Neues Mitglied
  1. FileStreamerThread.java: File (Java Platform SE 6)
  2. FileStreamerThread.java: Warum erstellst du bei jedem
    Code:
    setupReader
    neue Reader, schließt diese aber nie. (
    Code:
    shutdownReader
    ) wird nirgends aufgerufen
  3. Scheduler.java: in leere While-Schleifen sollte ein Sleep. (10ms sollten reichen)

...und das waren nur die Sachen die beim Drüberfliegen aufgefallen sind...

EDIT: Zum Singelton-Pattern gehört auch immer ein privater Konstruktor.

Danke erstmal!

HIntergrund:
In die Datei wird ständig geschrieben, und sie wird alle 5 Minuten erneuert.
Nachdem sie erneuert wurde, muss ich den Inputstream neu setzen.

1. file.lastModified() ist nicht das gleiche wie die ausgabe 'last Modified' von 'ls'.
Java liefert den Zeitpunkt zurück, an dem die Datei zuletzt verändert wurden (Jeder Schreibzugriff!). (also bsp. alle 2 Sekunden)
Unix´s 'ls' liefert den Zeitpunkt an dem die Datei erstellt wurde (obwohl 'modified' benannt)

Es handelt sich dabei nur um eine Übergangslösung, ich hoffe das ganze bald über nen TCP stream einlesen zu können...

2. Ich habe nicht alle Klassen abgebildet, der Übersichtlichkeit halber.
ShutdownReader() wird beim beenden des FileStreams aufgerufen... für die NeuInitialisierung ist das meines Erachtens nicht notwendig.

3. Werde ich einbauen!

4. SingeltonPattern, Private Konstruktor > Hab ich übersehen.


Werde den Thread.sleep einbauen, glaube aber nicht dass das mein Problem tangiert.
Außerdem rufe ich shutdownReader() vor der Neuinitialisierung auf... mal schaun obs was bringt.


grüße
 
Zuletzt bearbeitet:

Ariol

Top Contributor
Java:
Path file = ...;
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);

System.out.println("creationTime: " + attr.creationTime());
System.out.println("lastAccessTime: " + attr.lastAccessTime());
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());

System.out.println("isDirectory: " + attr.isDirectory());
System.out.println("isOther: " + attr.isOther());
System.out.println("isRegularFile: " + attr.isRegularFile());
System.out.println("isSymbolicLink: " + attr.isSymbolicLink());
System.out.println("size: " + attr.size());

Quelle: Managing Metadata (File and File Store Attributes) (The Java™ Tutorials > Essential Classes > Basic I/O)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Java Programm frisst RAM Allgemeine Java-Themen 6
X Wer kann mir das hier erklären? Programm frisst RAM! Allgemeine Java-Themen 11
hdi Was frisst in meinem Programm den Speicher / verschlechtert die Performance Allgemeine Java-Themen 11
Jose05 Umgang mit Exceptions in einen Programm Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
T Der Aufruf von CMD-Programm Allgemeine Java-Themen 30
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
Mike80 Processing Programm fiert ohne Arduino ein Allgemeine Java-Themen 2
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
districon Programm zum Durchsuchen von (Ebay-)Artikeln Allgemeine Java-Themen 1
T Addons im eigenen Programm Allgemeine Java-Themen 1
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
S .exe Datei/Programm auslesen? Allgemeine Java-Themen 2
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
Tiago1234 Warum hängt sich mein Programm auf? Allgemeine Java-Themen 22
D Programm designen Allgemeine Java-Themen 1
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
O 2D-Grafik BioFarben-Programm soll auf Vollbild schalten Allgemeine Java-Themen 1
S Nachrichten Filter Programm Allgemeine Java-Themen 14
S Programm schreiben, das mir aufgrund von Schlagwörtern, die ich im Internet suche, relevante Themen sofort anzeigt. Allgemeine Java-Themen 1
T Hilfe bei Programm. IDE: Eclipse mit EV3-Plugin, lejos Allgemeine Java-Themen 8
Lukas2904 Swing Anzeigen lassen das das Programm geschlossen wurde Allgemeine Java-Themen 3
TechnikTVcode Mail Programm Allgemeine Java-Themen 2
S Programm entwickeln, welches ein Dreieckspuzzle lösen kann Allgemeine Java-Themen 5
R Lesen von Interfaces (Programm Vervollständigen) Allgemeine Java-Themen 10
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
OSchriever Linux-Programm öffnen Allgemeine Java-Themen 6
P USER Management in SQL übergreifend auf JAVA Programm Allgemeine Java-Themen 41
L Eclipse Konsole im exportierten Programm Allgemeine Java-Themen 2
OSchriever Programm über Linux-Kommandozeile ausführen Allgemeine Java-Themen 20
D Verkauf von einem Programm welches ich in Java geschrieben habe Allgemeine Java-Themen 4
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
P Erstelltes Programm ist doppelt so groß Allgemeine Java-Themen 11
N Programm nach Abschluss neustarten lassen Allgemeine Java-Themen 6
S Einfaches Programm programmieren Allgemeine Java-Themen 5
M kleines KI Programm Idee Allgemeine Java-Themen 7
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
L Excel Datei löscht sich selbst im Programm - Java Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
ralfb1105 Starten Java App(s) (.jar) aus einem Java Programm Allgemeine Java-Themen 18
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2
N Programm startet nicht, nur per cmd Allgemeine Java-Themen 5
J Programm zum Suchen eines Wortes im Dateisystem Allgemeine Java-Themen 4
E Java Programm mit Clients erweitern - Möglichkeiten? Allgemeine Java-Themen 2
Joker4632 Methoden Befehl an bereits extern geöffnete Programm-spezifische Konsole senden Allgemeine Java-Themen 1
M Dieses Programm schneller machen? Allgemeine Java-Themen 2
R Programm zur Rekursion Allgemeine Java-Themen 5
N Quicksort Programm hängt sich auf Allgemeine Java-Themen 6
S Compiler-Fehler Programm verhält sich in Eclipse anders Allgemeine Java-Themen 1
B Input/Output Programm zum Auslesen/Beschreiben von Textdateien, wie Geschwindigkeit erhöhen? Allgemeine Java-Themen 18
dereki2000 Programm veröffentlichen Allgemeine Java-Themen 14
mrbig2017 Threads Chat Programm mit Threads? Allgemeine Java-Themen 2
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
J Java "Bank Programm" Brauche eure Hilfe Allgemeine Java-Themen 3
S Java Programm (Spiel mit den Boxen) Allgemeine Java-Themen 1
kodela Programm hängt in der Ereigniswarteschlange Allgemeine Java-Themen 13
A Java Programm verbessern/vereinfachen Allgemeine Java-Themen 20
P Programm darf nicht mehrfach startbar sein Allgemeine Java-Themen 16
S Programm hängt sich manchmal (selten) auf Allgemeine Java-Themen 9
JavaNewbie2.0 Programm nicht im Taskmanager schliesen können Allgemeine Java-Themen 15
J XML Datei mit installiertem Programm öffnen Allgemeine Java-Themen 7
Arif Input/Output Dateien im Jar-Programm speichern Allgemeine Java-Themen 12
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
JavaNewbie2.0 Programm bleibt "stehen" Allgemeine Java-Themen 2
JavaNewbie2.0 Start eines Anderen Programm erkennen Allgemeine Java-Themen 6
E Mit Java ein Python Programm starten Allgemeine Java-Themen 20
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
Aruetiise Methoden .jar mit Programm öffnen Allgemeine Java-Themen 2
C anderes Programm schließen! Allgemeine Java-Themen 5
C Webseiten Programm problem Allgemeine Java-Themen 5
E Programm auf Installation prüfen Allgemeine Java-Themen 1
J Programm zum Download von CSV-Dateien Allgemeine Java-Themen 4
E Programm ohne Windowsrand(Vollbild) ? Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
P Schnittstelle java Programm zu Webserver / Browser Allgemeine Java-Themen 2
J Schutz Programm Jar Exe Allgemeine Java-Themen 7
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
U Input/Output Warum wirft mir das Programm diesen Fehler? Allgemeine Java-Themen 6
X jvm exception abfangen und an externes Programm schicken Allgemeine Java-Themen 4
B Programm updaten mit FXLauncher Allgemeine Java-Themen 1
D Nicht quelloffenes Programm Allgemeine Java-Themen 5
F Java-Programm lizensieren Allgemeine Java-Themen 21
I Programm im Hintergrund bei Windows zur Steuerung der Tastatur nutzen Allgemeine Java-Themen 2
X Aus Programm "Installationsprogramm" machen Allgemeine Java-Themen 6
T Java Programm in Internetseite? Allgemeine Java-Themen 4
H Alter Java-Programm läuft nicht mehr. Laut strace fehlt libpthread.so.0 Allgemeine Java-Themen 3
H Runtime reagiert erst wenn Programm abbricht Allgemeine Java-Themen 1
E Exceptions abfangen und dann Programm stoppen - aber wie? Allgemeine Java-Themen 2
Neumi5694 Offenes Programm nutzen Allgemeine Java-Themen 4
L Java-Programm Zahlenkombinationen ausgeben Allgemeine Java-Themen 10
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
J Programm meldet "Keine Rückmeldung" nach Verbindung zum Server Allgemeine Java-Themen 4
T Java Programm sauber beenden (Mac OS) Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben