2011-04-06 202 views
2

我们在集群QA环境中出现以下错误。我们在Linux上运行Weblogic 10.3.3.0。java.io.NotSerializableException

####<Mar 29, 2011 3:59:54 PM CDT> <Error> <Cluster> <app2.qa.server.com> <qa_app2j> <[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <1301432394933> <BEA-000126> <All session objects should be serializable to replicate. Check the objects in your session. Failed to replicate non-serializable object. 
java.rmi.MarshalException: failed to marshal update(Lweblogic.cluster.replication.ROID;ILjava.io.Serializable;Ljava.lang.Object;); nested exception is: 
java.io.NotSerializableException: com.tjf.admin.virtualFair.Job$1 
at weblogic.rjvm.BasicOutboundRequest.marshalArgs(BasicOutboundRequest.java:92) 
at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:221) 
at weblogic.cluster.replication.ReplicationManager_1033_WLStub.update(Unknown Source) 
at sun.reflect.GeneratedMethodAccessor15419.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at weblogic.cluster.replication.SecureReplicationInvocationHandler$ReplicationServicesInvocationAction.run(SecureReplicationInvocationHandler.java:184) 
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121) 
at weblogic.cluster.replication.SecureReplicationInvocationHandler.invoke(SecureReplicationInvocationHandler.java:154) 
at $Proxy98.update(Unknown Source) 
at weblogic.cluster.replication.ReplicationManager.updateSecondary(ReplicationManager.java:535) 
at weblogic.servlet.internal.session.ReplicatedSessionData.syncSession(ReplicatedSessionData.java:594) 
at weblogic.servlet.internal.session.ReplicatedSessionContext.sync(ReplicatedSessionContext.java:85) 
at weblogic.servlet.internal.ServletRequestImpl$SessionHelper.syncSession(ServletRequestImpl.java:2810) 
at weblogic.servlet.internal.ServletRequestImpl$SessionHelper.syncSession(ServletRequestImpl.java:2785) 
at weblogic.servlet.internal.ServletResponseImpl$1.run(ServletResponseImpl.java:1480) 
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121) 
at weblogic.servlet.internal.ServletResponseImpl.send(ServletResponseImpl.java:1474) 
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1455) 
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201) 
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173) 

下面是导致此java文件:

package com.tjf.admin.virtualFair; 

import com.tjf.TargetedJobFairsConstants; 
import com.tjf.util.TargetedJobFairsToolBox; 
import org.apache.log4j.Logger; 

import java.io.Serializable; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.util.Comparator; 
import java.util.TreeMap; 

public class Job implements Serializable { 
protected int id; 
protected String name; 
protected String description; 
protected int companyId; 
protected String hash; 

private static Logger logger = initializeLogger(); 

protected static Logger initializeLogger() { 
Logger logger = Logger.getLogger(TargetedJobFairsConstants.TJF_LOG4J_NAME); 
logger.info("logger initialized!"); 
return logger; 
} 
public Job(String name, String description, int companyId) { 
this.name = name; 
this.description = description; 
this.companyId = companyId; 
} 

public Job(int id, String name, String description, int companyId) { 
this.id = id; 
this.name = name; 
this.description = description; 
this.companyId = companyId; 
} 

public Job(String name, String description) { 
this.name = name; 
this.description = description; 
this.companyId = companyId; 
} 

public String getHash() { 
if (id != -1 && name != null && !name.equals("")) { 
return TargetedJobFairsToolBox.createHash(name, "" + id); 
} else { 
return null; 
} 
} 

public int getCompanyId() { 
return companyId; 
} 

public void setCompanyId(int companyId) { 
this.companyId = companyId; 
} 

public int getId() { 
return id; 
} 

public void setId(int id) { 
this.id = id; 
} 

public String getName() { 
return name; 
} 

public void setName(String name) { 
this.name = name; 
} 

public String getDescription() { 
return description; 
} 

public void setDescription(String description) { 
this.description = description; 
} 

public static boolean validateName(String name, StringBuffer message) { 
if (name != null && !name.trim().equals("")) { 
// check for duplicated Virtual Fair Company Name 
return true; 
} else { 
if (message.length() > 0) { 
message.append(", Name "); 
} else { 
message.append(" Name "); 
} 
return false; 
} 
} 

public static boolean validateDescription(String description, StringBuffer message) { 
if (description != null && !description.trim().equals("")) { 
return true; 
} else { 
if (message.length() > 0) { 
message.append(", Description "); 
} else { 
message.append(" Description "); 
} 
return false; 
} 
} 

public static boolean validateCompanyIDString(String companyID, StringBuffer message) { 
if (companyID != null && !companyID.trim().equals("")) { 
return true; 
} else { 
if (message.length() > 0) { 
message.append(", unknown virtual fair error(32) "); 
} else { 
message.append(" unknown virtual fair error(32) "); 
} 
return false; 
} 
} 

protected boolean insertJob(Connection tjfConn, StringBuffer message) { 
PreparedStatement insertJobStmt = null; 
String insertJobSQL = null; 

try { 
insertJobSQL = "insert into VIRTUAL_FAIR_JOB (NAME, DESCRIPTION, COMPANY_ID) " + 
"values (?, ?, ?) "; 

insertJobStmt = tjfConn.prepareStatement(insertJobSQL); 
insertJobStmt.setString(1, this.name); 
insertJobStmt.setString(2, this.description); 
insertJobStmt.setInt(3, this.companyId); 

insertJobStmt.executeUpdate(); 
message.append(" Job \"" + this.name + "\" was successfully created."); 
return true; 
} catch (Exception x) { 
logger.error(x, x); 
if (message.length() > 0) { 
message.append(", unknown virtual fair error(33) "); 
} else { 
message.append(" unknown virtual fair error(33) "); 
} 
return false; 
} 
} 

protected boolean updateJob(Connection tjfConn, StringBuffer message) { 
PreparedStatement insertJobStmt = null; 
String insertJobSQL = null; 

try { 
insertJobSQL = "update VIRTUAL_FAIR_JOB set NAME = ?, DESCRIPTION = ? where" + 
" COMPANY_ID = ? and ID = ?"; 

insertJobStmt = tjfConn.prepareStatement(insertJobSQL); 
insertJobStmt.setString(1, this.name); 
insertJobStmt.setString(2, this.description); 
insertJobStmt.setInt(3, this.companyId); 
insertJobStmt.setInt(4, this.id); 

insertJobStmt.executeUpdate(); 
message.append(" Job \"" + this.name + "\" was successfully updated."); 
return true; 
} catch (Exception x) { 
logger.error(x, x); 
if (message.length() > 0) { 
message.append(", unknown virtual fair error(34) "); 
} else { 
message.append(" unknown virtual fair error(34) "); 
} 
return false; 
} 
} 

public static boolean deleteJobByCompanyID(Connection tjfConn, int companyID, StringBuffer message) { 
PreparedStatement deleteJobStmt = null; 
String deleteJobSQL = null; 

try { 
deleteJobSQL = "delete from VIRTUAL_FAIR_JOB where " + 
" COMPANY_ID = ? "; 

deleteJobStmt = tjfConn.prepareStatement(deleteJobSQL); 
deleteJobStmt.setInt(1, companyID); 

deleteJobStmt.executeUpdate(); 
message.append(" Jobs were successfully deleted."); 
return true; 
} catch (Exception x) { 
logger.error(x, x); 
if (message.length() > 0) { 
message.append(", unknown virtual fair error(35) "); 
} else { 
message.append(" unknown virtual fair error(35) "); 
} 
return false; 
} 
} 

public static boolean deleteJob(Connection tjfConn, int jobID, int companyID, StringBuffer message) { 
PreparedStatement deleteJobStmt = null; 
String deleteJobSQL = null; 

try { 
deleteJobSQL = "delete from VIRTUAL_FAIR_JOB where " + 
" COMPANY_ID = ? and ID = ? "; 

deleteJobStmt = tjfConn.prepareStatement(deleteJobSQL); 
deleteJobStmt.setInt(1, companyID); 
deleteJobStmt.setInt(2, jobID); 

deleteJobStmt.executeUpdate(); 
message.append(" Job was successfully deleted."); 
return true; 
} catch (Exception x) { 
logger.error(x, x); 
if (message.length() > 0) { 
message.append(", unknown virtual fair error(36) "); 
} else { 
message.append(" unknown virtual fair error(36) "); 
} 
return false; 
} 
} 

public static TreeMap<Job, Integer> getJobListforCompany(Connection tjfConn, int companyID, StringBuffer message) { 
TreeMap<Job, Integer> jobsList = new TreeMap<Job, Integer>(new Comparator() { 
public int compare(Object job, Object anotherJob) { 
String name1 = ((Job) job).getName(); 
String name2 = ((Job) anotherJob).getName(); 
return name1.toLowerCase().compareTo(name2.toLowerCase()); 
} 
}); 
PreparedStatement getJobListStmt = null; 
String getJobListSQL = null; 
ResultSet getJobListRset = null; 
try { 
getJobListSQL = "select ID, NAME, DESCRIPTION, COMPANY_ID from VIRTUAL_FAIR_JOB where COMPANY_ID = ?"; 
getJobListStmt = tjfConn.prepareStatement(getJobListSQL); 
getJobListStmt.setInt(1, companyID); 
getJobListRset = getJobListStmt.executeQuery(); 

while (getJobListRset.next()) { 
Job holdJob = new Job(getJobListRset.getInt(1), 
getJobListRset.getString(2), 
getJobListRset.getString(3), 
getJobListRset.getInt(4)); 
jobsList.put(holdJob, holdJob.id); 
} 
return jobsList; 
} catch (Exception x) { 
logger.error(x, x); 
if (message.length() > 0) { 
message.append(", unknown virtual fair error(37) "); 
} else { 
message.append(" unknown virtual fair error(37) "); 
} 
return null; 
} 
} 

public static Job getJobByID(Connection tjfConn, int jobID, StringBuffer message) { 

PreparedStatement getJobListStmt = null; 
String getJobListSQL = null; 
ResultSet getJobListRset = null; 
try { 
getJobListSQL = "select ID, NAME, DESCRIPTION, COMPANY_ID from VIRTUAL_FAIR_JOB where ID = ?"; 
getJobListStmt = tjfConn.prepareStatement(getJobListSQL); 
getJobListStmt.setInt(1, jobID); 
getJobListRset = getJobListStmt.executeQuery(); 

Job holdJob = null; 
if (getJobListRset.next()) { 
holdJob = new Job(getJobListRset.getInt(1), 
getJobListRset.getString(2), 
getJobListRset.getString(3), 
getJobListRset.getInt(4)); 
} 
return holdJob; 
} catch (Exception x) { 
logger.error(x, x); 
if (message.length() > 0) { 
message.append(", unknown virtual fair error(38) "); 
} else { 
message.append(" unknown virtual fair error(38) "); 
} 
return null; 
} 
} 
} 

什么可能会导致这样?

+0

以前这工作正常吗?我可以建议的唯一的事情是你的类包含不可串行化的东西 - 例如数据库连接。 – 2011-04-12 12:59:04

回答

8

这是对这个系列创作了比较:

TreeMap<Job, Integer> jobsList = new TreeMap<Job, Integer>(new Comparator() { 

至少,我觉得是,因为在堆栈跟踪的$1通常表示一个内部类,这是唯一的内部类,我可以看到。另外,我相信创建它会使TreeMap不可序列化(因为它想要序列化比较器)。

而不是使它成为一个匿名类,分开申报,并使其执行java.io.Serializable

+0

+1我面临同样的问题。你救了我的一天:)))) – Gautam 2014-02-26 17:23:36

相关问题