Date & RMI Problem

Status
Nicht offen für weitere Antworten.

Niki

Top Contributor
Hallo Forum!

Ich habe folgendes Problem:

Wenn ich Date-Objekte am Client erzeuge (OS: WindowsXP) und mittels RMI übertrage (OS: Linux) bekomme ich unterschiedliche Ergebnisse.

Hier das Testprogramm:

Code:
package rmidatetest;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Session extends Remote {
	public String sendObject(Object o) throws RemoteException;
	
	public void stop() throws RemoteException;
	
	String SERVICE_NAME = "Session";
}

package rmidatetest;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class SessionImpl extends UnicastRemoteObject implements Session {
	
	public SessionImpl() throws RemoteException{
		
	}

	public String sendObject(Object o) throws RemoteException {		
		return o.toString();
	}
	
	public void stop() throws RemoteException {
		new Thread(new Runnable(){
			public void run(){
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {					
				}
				System.exit(0);
			}
		}).start();				
	}

}

package rmidatetest;

import java.io.Serializable;
import java.util.Date;

public class Person implements Serializable {

	private Date gebdat = null;
	
	public Person(Date gd) {
		
		this.gebdat = gd;
	}

	public Date getGebdat() {
		return gebdat;
	}

	public void setGebdat(Date gebdat) {
		this.gebdat = gebdat;
	}
	
	public String toString() {
		return gebdat.toString();
	}
}

package rmidatetest;

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Server {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		if(args.length != 1) {
			System.out.println("usage: java -cp [classpath] rmidatetest.Server [port]");
			return;	
		}
		
		Session s = new SessionImpl();
		Registry reg = null;
		

		int port = Integer.parseInt(args[0]);
		
		try {
			System.out.println("try to locate registry at port " + port);
			reg = LocateRegistry.getRegistry(port);
			reg.rebind(Session.SERVICE_NAME, s);			
		} catch (RemoteException e) {
			System.out.println("registry wasn't located, try to create registry at port " + port);
			reg = LocateRegistry.createRegistry(port);
			reg.rebind(Session.SERVICE_NAME, s);
		}
		
		System.out.println("server started");
		
		while(true){
			System.gc();
			Thread.sleep(10000);
		}
	}

}

package rmidatetest;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Client {

	private static final SimpleDateFormat FORMATTER = new SimpleDateFormat(
			"ddMMyyyy");

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		if (args.length < 2) {
			System.out
					.println("usage: java -cp [classpath] rmidatetest.Client [server] [port] <optional:stop>");
			return;
		}

		String host = args[0];
		int port = Integer.parseInt(args[1]);
		
		System.out.println("connecting to " + host + ":" + port);

		Registry reg = LocateRegistry.getRegistry(host, port);
		Session session = (Session) reg.lookup(Session.SERVICE_NAME);

		if (args.length == 3 && "stop".equals(args[2])) {
			session.stop();
			System.exit(0);
		}

		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String von = null;
		String bis = null;
		do {
			System.out.println("Datumsformat: ddMMyyyy");
			System.out.println("von:");			
			von = in.readLine();

			if ("quit".equalsIgnoreCase(von)
					|| "exit".equalsIgnoreCase(von))
				break;
			System.out.println("bis:");
			bis = in.readLine();
			if ("quit".equalsIgnoreCase(bis)
					|| "exit".equalsIgnoreCase(bis))
				break;
			
			Date d_von = FORMATTER.parse(von);
			Date d_bis = FORMATTER.parse(bis);
			
			while(d_von.before(d_bis)){
				Person p = new Person(d_von);	
				String vorher = p.toString();				
				String nachher = session.sendObject(p);				
				
				if(!vorher.equals(nachher))
					System.out.println(vorher + " " + nachher);
				
				Calendar cal = Calendar.getInstance();
				cal.setTime(d_von);
				cal.add(Calendar.DAY_OF_MONTH, 1);
				d_von = cal.getTime();
			}
		} while (true);
	}

}

Folgende Ergebnisse kommen z.B. zurück:

Thu Sep 29 00:00:00 CEST 1949 Wed Sep 28 23:00:00 CET 1949
Fri Sep 30 00:00:00 CEST 1949 Thu Sep 29 23:00:00 CET 1949
Sat Oct 01 00:00:00 CEST 1949 Fri Sep 30 23:00:00 CET 1949
Sun Oct 02 00:00:00 CEST 1949 Sat Oct 01 23:00:00 CET 1949

Das Problem tritt jedoch nur auf wenn ich den Server unter Linux laufen lasse (jdk 1.4.2_08)

Ich bin für jeden Tipp dankbar!
 
Code:
private static final SimpleDateFormat FORMATTER = new SimpleDateFormat("ddMMyyyy", Locale.GERMANY);
...
Calendar cal = Calendar.getInstance(Locale.GERMANY);
 
Deine Ausgabe enthalten jeweils unterschiedliche Zeitzonen. CET und CEST, das erste ist ohne Sommerzeit, das zweite mit, deswegen die eine Stunde Unterschied.
 
Wie kleiner_held geschrieben hat lag das Problem an den Zeitzonen. Am Server war Europe/Vienna und am Client Europe/Berlin eingetragen. Ändert man das Property user.timezone am Client gibt es auch keine Probleme mehr.

Danke für die Hilfestellung!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben