This is a community driven project
the people here, are volunteers.
so unless someone is interested in your problem, it will be you that
comes up with a fix.
if you have a bug, then put in a jira.
http://docs.ofbiz.org/display/OFBADMIN/OFBiz+Contributors+Best+Practices

Jack Liu sent the following on 4/19/2009 7:50 PM:
> The problem has bothered me for several days.
> Who can help me?
> Thank you.
> 
> -----Original Message-----
> From: Jack Liu [mailto:[email protected]] 
> Sent: 2009年4月19日 19:36
> To: [email protected]
> Subject: RE: transaction consistency in ofbiz
> 
> I am still using service engine's transaction.
> <service name="processCustomerApprove" engine="java" location="task.Task" 
> invoke="processCustomerApprove">
>               <attribute name="wfid" mode="IN" type="Long"
>                       optional="false" />
>               <attribute name="action" mode="IN" type="String"
>                       optional="true" />
>               <attribute name="conclusion" mode="IN" type="String"
>                       optional="false" />
>               <attribute name="opinion" mode="IN" type="String"
>                       optional="true" />
>       </service>
> Attribute use-transaction is set default to be true, which is defined in 
> Services.xsd
> In task.Task.java, if the method shows like below,then transaction fails
> 
> public static Map processCustomerApprove(DispatchContext dctx, Map context) {
>               Map result = ServiceUtil.returnSuccess();
>               GenericDelegator delegator = dctx.getDelegator();
>               try {
>                       String opinion = (String) context.get("opinion");
>                       String conclusion = (String) context.get("conclusion");
>                       Debug.logInfo("Conclusion=" + conclusion + "\nopinion=" 
> + opinion,
>                                       module);
> 
>                       Long id = new Long(delegator.getNextSeqId("Opinion"));
>                       Debug.logInfo("id = " + id, module);
>                       GenericValue opinionValue = 
> delegator.makeValue("Opinion", UtilMisc
>                                       .toMap("id", id));
>                       opinionValue.set("wfid", wfid);
>                       opinionValue.set("approver", UserUtil.getUserName());
>                       opinionValue.set("conclusion", conclusion);
>                       opinionValue.set("opinion", opinion);
>                       delegator.create(opinionValue);
>                       
>                       Map test = new HashMap();
>               Test.put("kid",new Long(111));                          
>                       Long customerid = CcbUtils.getNextSeqId(delegator,
>                                               "customerinfo");
>                       GenericValue customerInfo = 
> delegator.makeValue("Customerinfo",
>                                               UtilMisc.toMap("id", id));
>                       customerInfo.setFields();
>                       delegator.create(customerInfo);
>                       return result;
>       }catch (GenericEntityException e) {
>                       e.printStackTrace();
>                       return ServiceUtil.returnError(e.getMessage());
>               }
> 
> So how is service engine's transaction used?
> But If I add TransactionUtil.begin(),commit() and rollback() in the above 
> method, then transaction works.
> This is not the end. When I add some more code to invoke OSWorkflow which 
> uses another datasource also configured in entityengine.xml and use the same 
> instance of GenericDelegator, transaction fails again........
> So my question is how I should do to implement transaction consistency in 
> OFBiz when processing multiple datasources.
> 
> Thank you in advance.
> 
> -----Original Message-----
> From: David E Jones [mailto:[email protected]] 
> Sent: 2009年4月18日 2:25
> To: [email protected]
> Subject: Re: transaction consistency in ofbiz
> 
> 
> It sounds like you're digging pretty deep, and I'd recommend a peek at  
> the TransactionUtil.java file. It's really quite simple code.
> 
> The begin() method returns false if there is already a transaction in  
> place, and along with it the rollback(beganTransaction) method will  
> only do the actually rollback if beganTransaction is true, otherwise  
> it will set the rollbackOnly flag. Why does it do this? The basic idea  
> is that a code block should never commit or rollback a transaction it  
> didn't begin (ie that's a fundamental rule for transaction management  
> code).
> 
> I HIGHLY recommend you find a good book on transaction management  
> because there are lots of things you need to know about to write  
> proper transaction demarcation code, either that or use the Service  
> Engine's transaction handling features (that's what they are there  
> for...).
> 
> -David
> 
> 
> On Apr 17, 2009, at 4:27 AM, Jack Liu wrote:
> 
>> I want to know Why TransactionUtil.begin() return false not true.
>> It doesn't support transaction?
>>
>> -----Original Message-----
>> From: Jack Liu [mailto:[email protected]]
>> Sent: 2009年4月17日 16:42
>> To: [email protected]
>> Subject: RE: transaction consistency in ofbiz
>>
>> Yes,I am sure because I debug step by step.
>>
>> GenericEntity.set() throws IllegalArgumentException ;
>>
>> I use OFBiz trunk version
>>
>> ________________________________
>>
>> From: Scott Gray [mailto:[email protected]]
>> Sent: 2009年4月17日 16:28
>> To: [email protected]
>> Subject: Re: transaction consistency in ofbiz
>>
>>
>>
>> Are you sure that a transaction rollback is actually invoked?   
>> GenericEntity.setFields() calls GenericEntity.set() which has a  
>> statement in it that logs an exception but doesn't actually throw one.
>>
>>
>>
>> Regards
>>
>> Scott
>>
>>
>>
>> HotWax Media
>>
>> http://www.hotwaxmedia.com <http://www.hotwaxmedia.com/>
>>
>>
>>
>> On 17/04/2009, at 7:41 PM, Jack Liu wrote:
>>
>>
>>
>>
>>
>> Hi, All
>> In OFBiz, there is a class named TransactionUtil which helps with some
>> common transaction tasks
>> I want to know how to use it, so I wrote some code below
>>
>> public static Map processCustomerApprove(DispatchContext dctx, Map
>> context) {
>>              Map result = ServiceUtil.returnSuccess();
>>              GenericDelegator delegator = dctx.getDelegator();
>>
>>              boolean beganTransaction =  false;
>>              try {
>>                     beganTransaction = TransactionUtil.begin();
>>
>>                     Workflow workflow =
>> WorkFlowFactory.getWorkFlow(UserUtil
>>                                   .getUserName());
>>                     Long wfid = (Long) context.get("wfid");
>>                     int actionNum = Integer.parseInt((String)
>> context.get("action"));
>>                     Debug.logInfo("workflow=" + wfid +
>> ",actionnumber=" + actionNum,
>>                                   module);
>>
>>                     String opinion = (String)
>> context.get("opinion");
>>                     String conclusion = (String)
>> context.get("conclusion");
>>                     Debug.logInfo("Conclusion=" + conclusion +
>> "\nopinion=" + opinion,
>>                                   module);
>>
>>                     Long id = new
>> Long(delegator.getNextSeqId("Opinion"));
>>                     Debug.logInfo("id = " + id, module);
>>                     GenericValue opinionValue =
>> delegator.makeValue("Opinion", UtilMisc
>>                                   .toMap("id", id));
>>                     opinionValue.set("wfid", wfid);
>>                     opinionValue.set("approver",
>> UserUtil.getUserName());
>>                     opinionValue.set("conclusion", conclusion);
>>                     opinionValue.set("opinion", opinion);
>>                     delegator.create(opinionValue);
>>
>>                     Map inputs = new HashMap();
>>                     inputs.put("conclusion", conclusion);
>>                     workflow.doAction(wfid, actionNum, inputs);
>>                     Debug.logInfo("workflow enters next step",
>> module);
>>
>>
>>                     if ("Agree".equals(conclusion) && actionNum ==
>> 2) {
>>                            //
>>                            EntityCondition wfidCondition =
>> EntityCondition.makeCondition(
>>                                          "wfid",
>> EntityOperator.EQUALS, wfid);
>>                            List customerInfoHistoryList =
>> delegator.findList(
>>                                          "CustomerinfoHistory",
>> wfidCondition, null, UtilMisc
>>
>> .toList("id DESC"), null, false);
>>                            GenericValue value =
>> EntityUtil.getFirst(customerInfoHistoryList);
>>                            //copy customer info from table
>> customerinfohistory to customerinfo
>>                     //value.remove("wfid");
>>                            value.remove("id");
>>
>>                            Long customerid =
>> CcbUtils.getNextSeqId(delegator, "customerinfo");
>>                            Debug.logInfo("id = " + customerid,
>> module);
>>                            GenericValue customerInfo =
>> delegator.makeValue("Customerinfo",
>>                                          UtilMisc.toMap("id",
>> id));
>>                            customerInfo.setFields(value);
>>                            delegator.create(customerInfo);
>>
>>                     }
>>
>>              } catch (Exception e) {
>>                     try {
>>
>> TransactionUtil.rollback(beganTransaction, "something wrong in the
>> operation", e);
>>                     } catch (GenericTransactionException e1) {
>>                            e1.printStackTrace();
>>                     }
>>              }finally {
>>                     try {
>>                            TransactionUtil.commit();
>>                     } catch (GenericTransactionException e) {
>>                            e.printStackTrace();
>>                     }
>>              }
>>
>>              return result;
>>       }
>> }
>>
>> When I debug, TransactionUtil.begin() returns false,
>> And an error happens when running customerInfo.setFields(value) (I  
>> know
>> why),
>> , so jvm catches the exception, TransactionUtil.rollback is invoked.
>> Because beganTransaction is false, it doesn't roll back.
>> When program ends, transaction doesn't work eventually.
>>
>> Could you tell me how I should do to keep transaction consistent?
>>
>>
>>
>>
>> Best Regards,
>>
>> Jack Liu
>>
>>
>>
> 
> 
> 

Reply via email to