2013-07-07 1 views
0

line clanovi = ((HashMap) in.readObject()); load() 메서드가 실행되지만 항상 그런 것은 아닙니다. 그것은 5-6 후, 때로는 심지어 내 서블릿에서로드 메서드의 10 호출, 완전히 무작위로 발생합니다. 제발 도와주세요, 나는이에 대한 해결이 필요 내일 아침 프로젝트 방어 :(갑자기 EOFileException이 발생했습니다.

그냥 ClanPostave가 직렬화 대답 내가 부하 방법() 플러시 추가 시도했지만 아무것도 도움이되지

public class Clanovi implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 


HashMap<String, ClanPostave> clanovi = new HashMap<String, ClanPostave>(); 

public HashMap<String, ClanPostave> getClanovi() { 
    return clanovi; 
} 

public void setClanovi(HashMap<String, ClanPostave> clanovi) { 
    this.clanovi = clanovi; 
} 


public synchronized void save(String path){ 

    try { 

     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path + "/clanovi.dat")); 
     out.writeObject(clanovi); 
     out.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

@SuppressWarnings("unchecked") 
public synchronized void load(String path){ 

    try { 
     ObjectInputStream in = new ObjectInputStream(new FileInputStream(path + "/clanovi.dat")); 
     clanovi = ((HashMap<String,ClanPostave>) in.readObject()); 
     in.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

스택 트레이스.. :

java.io.EOFException 
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source) 
    at java.io.ObjectInputStream.readClassDesc(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source) 
    at java.io.ObjectInputStream.defaultReadObject(Unknown Source) 
    at java.util.Calendar.readObject(Unknown Source) 
    at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at java.io.ObjectStreamClass.invokeReadObject(Unknown Source) 
    at java.io.ObjectInputStream.readSerialData(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source) 
    at java.io.ObjectInputStream.readSerialData(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at java.util.HashMap.readObject(Unknown Source) 
    at sun.reflect.GeneratedMethodAccessor31.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at java.io.ObjectStreamClass.invokeReadObject(Unknown Source) 
    at java.io.ObjectInputStream.readSerialData(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at beans.Clanovi.load(Clanovi.java:52) 
    at servlets.DodajClana.doPost(DodajClana.java:51) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
    at java.lang.Thread.run(Unknown Source) 

는 EOFException는 조니 덕분에 사라,하지만 지금은 이것에 문제가 있습니다

try { 
      clanovi1.dodajClana(new ClanPostave(idclana,ime,prezime,mesto,new GregorianCalendar(datumGodina, datumMesec, datumDan),biografija,uloga)); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     clanovi1.save(path); 
     clanovi1.load(path); 
     HashMap<String, ClanPostave> clanovi = clanovi1.getClanovi(); 
,536,913을

이 코드 다음에 HashMap이 비어 있습니다. 그리고 Joni가 제안한이 변경 이전에 try 블록에 추가 된 값으로 채워졌습니다. 무엇이 잘못 될 수 있습니까?

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path + "/clanovi.tmp")); 
    out.writeObject(clanovi); 
    out.close(); 
    new File(path + "/clanovi.tmp").renameTo(new File(path + "/clanovi.ovi")); 

이는 load 과정을 의미 할 수 있습니다 지금 : 이름을 변경 한 후 불완전한 파일이 임시 파일에 쓰기 읽기 방지하기

package servlets; 

    import java.io.IOException; 
    import java.util.Calendar; 
    import java.util.GregorianCalendar; 
    import java.util.HashMap; 

    import javax.servlet.ServletContext; 
    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 

    import beans.ClanPostave; 
    import beans.Clanovi; 
    import beans.Korisnik; 

    /** 
    * Servlet implementation class DodajClana 
    */ 
    public class DodajClana extends HttpServlet { 
     private static final long serialVersionUID = 1L; 



     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
      request.getRequestDispatcher("index.jsp").forward(request, response); 
     } 
     /** 
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
     */ 
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
      ServletContext ctx = getServletContext(); 
      Korisnik korisnik = (Korisnik) request.getSession().getAttribute("korisnik"); 

      if(korisnik != null && korisnik.getAdmin()){ 
      String path = ctx.getRealPath(""); 
      String idclana = request.getParameter("idclana"); 
      String ime = request.getParameter("ime"); 
      String prezime = request.getParameter("prezime"); 
      String mesto = request.getParameter("mesto"); 
      int datumGodina = Integer.parseInt(request.getParameter("datumGodina")); 
      int datumMesec = Integer.parseInt(request.getParameter("datumMesec"))-1; 
      int datumDan = Integer.parseInt(request.getParameter("datumDan")); 
      String biografija = request.getParameter("biografija"); 
      String uloga = request.getParameter("uloga"); 

      System.out.println(idclana); 

      Clanovi clanovi1 = new Clanovi(); 
      clanovi1.load(path); 

      if(!isDateValid(datumGodina, datumMesec, datumDan)){ 
       System.out.println("ne valja datum"); 
       request.setAttribute("greska1", "Nevalidan datum!"); 
      } 

      if(clanovi1.getClanovi().containsKey(idclana)){ 
       System.out.println("ne valja id"); 
       request.setAttribute("greska2", "Clan sa tim ID-jem vec postoji u bazi!"); 
      } 

      if((!isDateValid(datumGodina, datumMesec, datumDan))||clanovi1.getClanovi().containsKey(idclana)){ 

       request.getRequestDispatcher("/WEB-INF/clanGreska.jsp").forward(request, response); 
      } 

      boolean test = !((!isDateValid(datumGodina, datumMesec, datumDan))||(clanovi1.getClanovi().containsKey(idclana)) || ((!isDateValid(datumGodina, datumMesec, datumDan))||clanovi1.getClanovi().containsKey(idclana))); 
      System.out.println(test); 
      if(test){ 

       try { 
        clanovi1.dodajClana(new ClanPostave(idclana,ime,prezime,mesto,new GregorianCalendar(datumGodina, datumMesec, datumDan),biografija,uloga)); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       clanovi1.save(path); 
       try { 
        System.out.println(clanovi1.getClan(idclana)); 
       } catch (Exception e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 

       try { 
        System.out.println(clanovi1.getClan(idclana)); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       HashMap<String, ClanPostave> clanovi = clanovi1.getClanovi(); 
       ctx.setAttribute("clanovi", clanovi);  
       request.getRequestDispatcher("index.jsp"); 
      } 

      }     

      else request.getRequestDispatcher("index.jsp").forward(request, response); 
     } 


     public synchronized boolean isDateValid(int year, int month, int day) { 
      boolean valid = true; 
      Calendar calendar = new GregorianCalendar(year, month, day); 
      if (year != calendar.get(Calendar.YEAR)) { 
       valid = false; 
      } 
      else if (month != calendar.get(Calendar.MONTH)) { 
       valid = false; 
      } 
      else if (day != calendar.get(Calendar.DAY_OF_MONTH)) { 
       valid = false; 
      } 
      return valid; 
     } 



    } 
+0

당신이 스택 추적을 공유시겠습니까? –

+0

독자가 불완전한 파일을 읽지 못하게하는 동기화가 있습니까? – Joni

+0

save() 및 load()가 동시에 호출되는 경우가 있습니까? –

답변

1

한 가지 방법은 다음과 같습니다

전체 서블릿이다 첫 번째 실행시 파일을 찾지 못하거나 오래된 데이터를 읽을 수 있습니다.

+0

감사 게시판에 전체 서블릿을 추가 했으므로 EOFException 문제가 해결되었지만 최대한 빨리 새 문제를 수정하십시오. – kecman

-1

동기화 된 블록/함수를 사용하여 직렬화 된 파일을로드하고 저장할 수 있습니다.

뭔가 같은 -

public enum Operation { 
      LOAD, 
      SAVE;  
} 

synchronized void loadOrSave(String path, Operation operation) { 
    if (operation == Operation.LOAD) { 
     //do load here 
    } else { 
     //do save here 
    } 

} 
+0

파일 잠금은 프로세스간에 만 작동합니다. 이것은 모두 같은 과정에서 일어납니다. – EJP

+0

EJP - 나에게 설명해 주시겠습니까? 몇 가지 링크가 당신의 요점을 증명할 수 있습니까? –

+0

신경 쓰지 마세요. 감사. –

관련 문제