[JBoss JIRA] Created: (JBPM-1914) Problem in retrieving variables of Serializable objects
by Mauro Molinari (JIRA)
Problem in retrieving variables of Serializable objects
-------------------------------------------------------
Key: JBPM-1914
URL: https://jira.jboss.org/jira/browse/JBPM-1914
Project: JBoss jBPM
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: Core Engine
Affects Versions: jBPM 3.3.0 GA
Reporter: Mauro Molinari
Priority: Critical
I have encountered a serious problem working with variables whose value is a serializable object.
The problem is that sometimes (not always!) an error like the following is given when retrieving a variable:
java.lang.ClassCastException: org.jbpm.bytes.ByteArray$$EnhancerByCGLIB$$cc67d06e
The code is like:
MySerializableClass obj = (MySerializableClass) contextInstance.getVariable("myVariable");
(of course, "myVariable" is a variable that I previously have set with a MySerializableClass object)
Apart from the CGLIB awful problem with proxies, even if I extract the value from the proxy with the following:
public static Object getCGLIBProxiedObject(final Object proxy)
{
if(proxy instanceof HibernateProxy)
{
final LazyInitializer initializer =
((HibernateProxy) proxy).getHibernateLazyInitializer();
return initializer.getImplementation();
}
return proxy;
}
the problem is that the variable value is retrieved as a org.jbpm.bytes.ByteArray instead of a MyClass instance!
I did some debugging and discovered that:
- in org.jbpm.context.exe.VariableContainer.getVariable(String), when org.jbpm.context.exe.VariableContainer.hasVariableLocally(String) is called, Hibernate lazily retrieves a org.jbpm.context.exe.variableinstance.ByteArrayInstance instance from the database and creates it using its empty constructor
- unfortunately, when a org.jbpm.context.exe.VariableInstance (extended by ByteArrayInstance) is constructed using its constructor, its converter instance variable remains null
- the VariableInstance converter instance variable is set to something only when a VariableInstance is created using org.jbpm.context.exe.JbpmType.newVariableInstance(), but this is not the case when a VariableInstance is lazily loaded by Hibernate; in fact, in my case, org.jbpm.context.exe.JbpmType.newVariableInstance() is never called and the converter field of my ByteArrayInstance instance is always null!
- this causes org.jbpm.context.exe.VariableInstance.getValue() to return the value given by org.jbpm.context.exe.variableinstance.ByteArrayInstance.getObject() without applying the necessary conversion (deserialization)
Please note that my variable values are stored in jBPM database in JBPM_VARIABLEINSTANCE table with the CONVERTER column correctly populated with "R".
I think this is a critical problem. By now, the only workaround I have found is to always apply the following utility method when retrieving variable values, before returning them to the client code:
public static Object extractVariableValue(final Object rawValue)
{
Object result = CardinisJbpmUtilities.getCGLIBProxiedObject(rawValue);
if(result instanceof ByteArray)
try
{
result =
new ObjectInputStream(new ByteArrayInputStream(((ByteArray) result)
.getBytes())).readObject();
}
catch(final Exception e)
{
throw new RuntimeException(e);
}
return result;
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
15 years
[JBoss JIRA] Created: (JBPM-1772) Fix JoinDbTest on postgresql
by Thomas Diesler (JIRA)
Fix JoinDbTest on postgresql
----------------------------
Key: JBPM-1772
URL: https://jira.jboss.org/jira/browse/JBPM-1772
Project: JBoss jBPM
Issue Type: Task
Security Level: Public (Everyone can see)
Reporter: Thomas Diesler
Fix For: jBPM 3.3.1 GA
expected:<[10X, 10Y, 10Z, 10a, 10b, 10c, 10d, 10e, 11X, 11Y, 11Z, 11a, 11b, 11c, 11d, 11e, 12X, 12Y, 12Z, 12a, 12b, 12c, 12d, 12e, 13X, 13Y, 13Z, 13a, 13b, 13c, 13d, 13e, 14X, 14Y, 14Z, 14a, 14b, 14c, 14d, 14e, 15X, 15Y, 15Z, 15a, 15b, 15c, 15d, 15e, 16X, 16Y, 16Z, 16a, 16b, 16c, 16d, 16e, 17X, 17Y, 17Z, 17a, 17b, 17c, 17d, 17e, 18X, 18Y, 18Z, 18a, 18b, 18c, 18d, 18e, 19X, 19Y, 19Z, 19a, 19b, 19c, 19d, 19e, 1X, 1Y, 1Z, 1a, 1b, 1c, 1d, 1e, 20X, 20Y, 20Z, 20a, 20b, 20c, 20d, 20e, 2X, 2Y, 2Z, 2a, 2b, 2c, 2d, 2e, 3X, 3Y, 3Z, 3a, 3b, 3c, 3d, 3e, 4X, 4Y, 4Z, 4a, 4b, 4c, 4d, 4e, 5X, 5Y, 5Z, 5a, 5b, 5c, 5d, 5e, 6X, 6Y, 6Z, 6a, 6b, 6c, 6d, 6e, 7X, 7Y, 7Z, 7a, 7b, 7c, 7d, 7e, 8X, 8Y, 8Z, 8a, 8b, 8c, 8d, 8e, 9X, 9Y, 9Z, 9a, 9b, 9c, 9d, 9e]>
but was:<[100X, 100Y, 100Z, 100a, 100b, 100c, 100d, 100e, 108X, 108Y, 108Z, 108a, 108b, 108c, 108d, 108e, 116X, 116Y, 116Z, 116a, 116b, 116c, 116d, 116e, 124X, 124Y, 124Z, 124a, 124b, 124c, 124d, 124e, 132X, 132Y, 132Z, 132a, 132b, 132c, 132d, 132e, 140X, 140Y, 140Z, 140a, 140b, 140c, 140d, 140e, 148X, 148Y, 148Z, 148a, 148b, 148c, 148d, 148e, 156X, 156Y, 156Z, 156a, 156b, 156c, 156d, 156e, 164X, 164Y, 164Z, 164a, 164b, 164c, 164d, 164e, 172X, 172Y, 172Z, 172a, 172b, 172c, 172d, 172e, 180X, 180Y, 180Z, 180a, 180b, 180c, 180d, 180e, 188X, 188Y, 188Z, 188a, 188b, 188c, 188d, 188e, 36X, 36Y, 36Z, 36a, 36b, 36c, 36d, 36e, 44X, 44Y, 44Z, 44a, 44b, 44c, 44d, 44e, 52X, 52Y, 52Z, 52a, 52b, 52c, 52d, 52e, 60X, 60Y, 60Z, 60a, 60b, 60c, 60d, 60e, 68X, 68Y, 68Z, 68a, 68b, 68c, 68d, 68e, 76X, 76Y, 76Z, 76a, 76b, 76c, 76d, 76e, 84X, 84Y, 84Z, 84a, 84b, 84c, 84d, 84e, 92X, 92Y, 92Z, 92a, 92b, 92c, 92d, 92e]>
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
15 years, 2 months
[JBoss JIRA] Created: (JBPM-2036) StaleObjectStateException when timer firing leads to process end and timer has 'repeat' attribute set
by Martin Putz (JIRA)
StaleObjectStateException when timer firing leads to process end and timer has 'repeat' attribute set
-----------------------------------------------------------------------------------------------------
Key: JBPM-2036
URL: https://jira.jboss.org/jira/browse/JBPM-2036
Project: JBoss jBPM
Issue Type: Bug
Security Level: Public (Everyone can see)
Affects Versions: jBPM 3.3.1 GA, jBPM-3.2.5.SP1
Reporter: Martin Putz
Assignee: Alejandro Guizar
Fix For: jBPM 3.2.6 GA
With the following timer definition on a state node
<state name='state1'>
<timer name='timer-to-end-with-repeat' duedate='1 second' repeat='5 seconds'>
<action class='org.jbpm.scheduler.exe.TimerDbTest$Signal' />
</timer>
<transition name='to_end' to='end'/>
</state>
and the action class execute() method being
public void execute(ExecutionContext executionContext) throws Exception {
executionContext.leaveNode();
}
leads to:
2009-02-10 21:38:45,404 16508 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] (JbpmJobExecutor:127.0.0.1:1:) Could not synchronize database state with session
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.jbpm.job.Timer#86]
at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1769)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2412)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2312)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2612)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:96)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.jbpm.persistence.db.DbPersistenceService.commit(DbPersistenceService.java:226)
at org.jbpm.persistence.db.DbPersistenceService.endTransaction(DbPersistenceService.java:131)
at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:197)
at org.jbpm.svc.Services.close(Services.java:243)
at org.jbpm.JbpmContext.close(JbpmContext.java:133)
at org.jbpm.job.executor.JobExecutorThread.executeJob(JobExecutorThread.java:194)
at org.jbpm.job.executor.JobExecutorThread.run(JobExecutorThread.java:61)
If 'repeat' is not set, the process finishes just fine.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
15 years, 2 months