Non ho molta familiarità con J2EE
così potrei fare alcuni errori mentre spiegavo l'errore. Per favore, sopportami.glassfish throwing org.postgresql.xa.PGXAException
Sto cercando di eseguire una query sulla mia applicazione enterprise Java ma glassfish
tiri la seguente eccezione:
[#|2014-12-05T15:31:00.412+0200|WARNING|glassfishv3.0|javax.enterprise.system.core.transaction.com.sun.jts.CosTransactions|_ThreadID=86;_ThreadName=Thread-1;|JTS5031: Exception [java.lang.RuntimeException: org.postgresql.xa.PGXAException: Error preparing transaction] on Resource [prepare] operation.|#]
[#|2014-12-05T15:31:00.413+0200|SEVERE|glassfishv3.0|javax.enterprise.system.core.transaction.com.sun.jts.CosTransactions|_ThreadID=86;_ThreadName=Thread-1;|JTS5031: Exception [org.omg.CORBA.INTERNAL: vmcid: 0x0 minor code: 0 completed: Maybe] on Resource [rollback] operation.|#]
[#|2014-12-05T15:31:00.439+0200|WARNING|glassfishv3.0|javax.enterprise.system.container.ejb.com.sun.ejb.containers|_ThreadID=86;_ThreadName=Thread-1;|A system exception occurred during an invocation on EJB OFReportTimeoutService method public void com.companyname.appname.service.OFReportTimeoutService.ofTimeout()
javax.ejb.EJBException: Unable to complete container-managed transaction.
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:4962)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4716)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1941)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1892)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
at com.sun.proxy.$Proxy307.ofTimeout(Unknown Source)
at com.companyname.appname.service.__EJB31_Generated__OFReportTimeoutService__Intf____Bean__.ofTimeout(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.companyname.appname.servlet.GFv3EJBInvokerJob.execute(GFv3EJBInvokerJob.java:88)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Caused by: javax.transaction.SystemException: org.omg.CORBA.INTERNAL: JTS5031: Exception [org.omg.CORBA.INTERNAL: vmcid: 0x0 minor code: 0 completed: Maybe] on Resource [rollback] operation. vmcid: 0x0 minor code: 0 completed: No
at com.sun.jts.jta.TransactionManagerImpl.commit(TransactionManagerImpl.java:330)
at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.commitDistributedTransaction(JavaEETransactionManagerJTSDelegate.java:169)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:843)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:4951)
... 14 more
|#]
Un altro sistema con le stesse versioni di glassfish
, postgresql
, e l'applicazione web non gettare alcuna eccezione. Entrambi hanno gli stessi file domain.xml
e postgresql.conf
.
ho cambiato max_prepared_transactions
100
-10000
e shared_buffers
32MB
-320MB
, ma non ha funzionato.
Qualche idea?
MODIFICA: codiceofTimeout
aggiunto.
@Startup
@Singleton(mappedName="OFReportTimeoutService")
public class OFReportTimeoutService {
@EJB
protected QueueManagerService queueManagerService;
@EJB
protected AnalyzerService analyzerService;
@EJB
protected ErrorReportJpaController errorReportJpaController;
@EJB
protected ReportJpaController reportJpaController;
protected Boolean isProcessing = Boolean.FALSE;
private Boolean exceptionPresent = Boolean.FALSE;
private String errorText = "error";
private Integer reportId = 0;
//@Schedule(second="*/10", minute="*", hour="*", persistent=false)
public void ofTimeout() {
//System.out.println("STATE : " + "OfReportTimeOutService is running...") ;
if(exceptionPresent) {
ErrorReport errorReport = errorReportJpaController.create();
errorReport.setErrorDate(new Date());
errorReport.setErrorText(errorText);
errorReport.setReport(reportJpaController.find(reportId));
errorReportJpaController.persist(errorReport);
exceptionPresent = Boolean.FALSE;
if (queueManagerService.getLastReport() != null)
queueManagerService.resetLastReport();
isProcessing = Boolean.FALSE;
}
if (isProcessing)
return;
if (queueManagerService.reportQueueSize() > 0)
isProcessing = Boolean.TRUE;
else {
//System.out.println("STATE : " + "queueManagerService.reportQueueSize == 0 !!!") ;
return;
}
while (queueManagerService.reportQueueSize() > 0)
try {
Report report = queueManagerService.pullReport();
reportId = report.getId();
if (reportId != null)
System.out.println("STATE : " + "reportId var") ;
analyzerService.process(report);
} catch (ReportJPAException rex) {
Logger.getLogger(OFReportTimeoutService.class.getName()).log(Level.SEVERE, null, rex);
exceptionPresent = Boolean.TRUE;
errorText = rex.toString();
break;
} catch (RuntimeException rex) {
Logger.getLogger(OFReportTimeoutService.class.getName()).log(Level.SEVERE, null, rex);
exceptionPresent = Boolean.TRUE;
errorText = rex.toString();
break;
} catch (Exception ex) {
Logger.getLogger(OFReportTimeoutService.class.getName()).log(Level.SEVERE, null, ex);
exceptionPresent = Boolean.TRUE;
errorText = ex.toString();
break;
}
if(exceptionPresent) {
return;
}
isProcessing = Boolean.FALSE;
queueManagerService.resetLastReport();
}
public Boolean isProcessing() {
return isProcessing;
}
public void setProcessing(Boolean isProcessing) {
this.isProcessing = isProcessing;
}
}
Puoi aggiungere il codice del metodo 'ofTimeout()' alla domanda? – unwichtich
Ho modificato il mio post e aggiunto il codice @unwichtich – Alptugay
C'è qualche ragione particolare per utilizzare una transazione XA? Le transazioni XA devono essere utilizzate solo quando è necessario sincronizzare lo stato su più risorse, ad esempio le scritture devono avvenire su 2 database o broker JMS. Se stai solo cercando di leggere da una coda, assicurati che autoAck sia disabilitato e gestisca le eccezioni manualmente. – JVXR