You can leave your code mostly the same, but just require a new transaction
for createOrder, you'll see the option available in the runSync overloaded
methods.

I've been working with an older version of OFBiz for the last few years so
I wasn't aware of this change, but I believe it is better than what we had
before.  The primary purpose of an event in OFBiz is to perform some sort
of action, and it is very easy for developers to unwittingly directly write
to the database inside an event.  Obviously this is problematic when the
updates aren't wrapped in a transaction.  Virtually everything else in
OFBiz automatically begins a transaction (services, simple methods,
screens, etc.) and I think it was a good idea for the sake of consistency
to have the same behavior with events.

The behavioral change between versions is regrettable, but also unavoidable
if we want to progress.

Regards
Scott

On 26 July 2016 at 19:02, 叶双明 <yeshuangm...@gmail.com> wrote:

> Hi all:
>
> After update ofbiz to 13.07.03, our system was Unstable. At last, I found
> the cause was The transaction created in Event, introduced in revision
> 1,740,632.
> And found https://issues.apache.org/jira/browse/OFBIZ-6808.
> But I doubt whether it is good to do this.
>
> In my opinion:
>
> 1. It would make more long-running transaction.
>     For example, there was a event which call three services, the three
> services has their own transaction before the change, but now there is one
> big transaction for the event and three services, of course the transaction
> would run longer time.
>
> 2. It would make a lots of transaction run longer time.
>     Almost all event would do something else after call service, for
> example, convert the result from service to JSON format, but the conversion
> not need transaction!
>
> 3. It makes it difficult to manage transactions between services and
> events.
>     For example, there was a event:
>
>     public String createOrder() {
>
>         //some business process here... and define serviceCtx
>
>         def results = dispatcher.runSync("createOrder", serviceCtx)
>
>         //some business process here... and return success or error at last
>
>     }
>
>     after call createOrder service success, i want to fire a jms
> service(call it jmsIndexOrder) to index the order in Elasticsearch。
>     I use secas before the change, everything work well.
>
>     <eca service=“createOrder” event="return">
>         <action service="jmsIndexOrder" mode="sync"/>
>     </eca>
>
>
>     but now i don't know where ant how to call jmsIndexOrder. :(
>
>
> --
> 叶双明
>

Reply via email to