[ https://issues.apache.org/jira/browse/ODE-483?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12717963#action_12717963 ]
Rafal Rusin commented on ODE-483: --------------------------------- Here's a proposal for interface and implementation (includes proper timers support). The basic use cases for replayer are: 1. migrate existing log running instances to newest process version given their communication (incoming and outgoing requests) 2. reproduce error scenarios between two instances of ODE (eg. production and development) Interface: Extends management api by 2 operations: replay and getCommunication. In order to do 1, you invoke: <pmap:replay> <replay> <ns:upgradeInstance>1234</ns:upgradeInstance> </replay> </pmap:replay> You get a new instance in the newest process version. The old one is deleted. To do 2, you need to retrieve exchanges from instance (or instances) by: <pmap:getCommunication> <getCommunication> <ns:iid>1234</ns:iid> </getCommunication> </pmap:getCommunication> Then, you execute replay on the other ODE installation to replicate instance: <pmap:replay xmlns:ns="http://www.apache.org/ode/pmapi/types/2006/08/02/"> <replay> <ns:restoreInstance> <ns:processType xmlns:p="http://sample.bpel.org/bpel/sample">p:OnEventCorrelation</ns:processType> ... exchanges </ns:restoreInstance> </replay> </pmap:replay> To have control over time in bpel process, I introduced a variable $ode:currentEventDateTime. It's equivalent to $fn:current-dateTime() during live session and it's set to corresponding time in past during replaying. I think this interface is quite simple and solves it's job well. Implementation notes: - It works in one transaction. You can migrate a few instances at once and get an error, which will roll back all work if an error occurrs in some case. - It extends BpelRuntimeContextImpl by ReplayerBpelRuntimeContextImpl class, which overrides methods like invoke and registerTimer to mock up communication - It implements ReplayerScheduler, which executes actions from past in time sorted order (exchanges given to replayer have createTime field, which is used for sorting) - jobs from past are processed in ReplayerScheduler and jobs in future are registered in engine's scheduler. - In order to make integrity constraints, replaying returns error if: - a first incoming request is routed to an existing instance instead of creating a new one - next incoming request is routed to other instance or creates a new instance - there is some unprocessed communication while finishing replaying (for example if there is some outgoing exchange for service, which did not have INVOKE from replayed instance) - It extends bpel-compiler and xpath evaluation by $ode:currentEventDateTime variable - It adds currentEventDateTime property to BpelRuntimeContext - It adds replayer package to bpel engine in bpel-runtime module - It changes visibility of some fields and methods in bpel engine from private to protected and from optional to public. Attached are: - replayer-proposal.diff - an implementation applicable for ODE1X branch, rev. 777412 - test process for axis2 distro with soapui 2.5.2 test case demonstrating usage of replayer. Limitations: - It currently works only with hibernate DAO, on Axis2 and JBI distros. > Add serialize/deserialize process instances in Management API > ------------------------------------------------------------- > > Key: ODE-483 > URL: https://issues.apache.org/jira/browse/ODE-483 > Project: ODE > Issue Type: New Feature > Affects Versions: Wishlist > Reporter: Rafal Rusin > Fix For: Wishlist > > > Imagine situation when client has deployed a process with a lot of active, > long running instances. Then he finds there's a bug in this process and a > simple bugfix is needed. But with current versioning rules, new version is > only used when new instances are created. So there's no simple way for doing > such bufixes (which are usually possible with eg. java application using > database connection). It is a blocking argument for deploying ODE Bpel > solution instead of a regular java application. > I think the best way to deal with such situations is to add > serialize/deserialize to/from xml operations for process instances in > management API. Also pause/resume ODE operations would be useful. > Then, a bugfix procedure would look like this; > -pause ode > -serialize instances > -deploy newer version > -deserialize instances and fix manually any import errors > -resume ODE > It would also be a benefit of being able to do migration from older to newer > ODE and between Hibernate/JPA DAOs, which I saw already in some bug reports. > What do you think about it? > Regards -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.