OFBiz調試技巧禪與道

1、如何調試OFBiz
首先你需要學習和熟悉OFBiz的教程與工具指導文檔。指導文檔特別重要,因爲很多子主題內容不是排列最前的內容卻可能導致問題的發生。你應該熟悉類似於Freemaker,beanshell,XML這些技術。你也應該有過處理那些與OFBiz無關問題的經驗,比如處理數據庫或服務器引起的問題。
現在,你應該仔細查看日誌文件瞭解你錯誤發生的原因。OFBiz在日誌文件中提供大量的信息,這些信息將有助於你瞭解你遇到的問題。它比處理的藝術更重要。哪些東西看上去工作有些特別,比如比如有些關聯程序將導致或影響到的結果,你都可以在日誌文件中找到。如果你確實無法在日誌文件中發現任何有用的東西,這時增加你自己的日誌信息直到你有足夠的信息來發現實際的問題所在。
本指引將向你介紹OFBiz的日誌文件工作情況,如何增加你自己的日誌記錄,以及一些常見信息的含義。這些知識的理解建立在你理解JAVA及其它相關的技術基礎上,所有問題的焦點只在於OFBiz的概念與信息內容中。

2. OFBiz日誌文件
OFBiz創建較多日誌文件並將它們存儲於logs/目錄(在opentaps-0.9或更早版本中)或framework/logs/(在opentaps-0.9之後版本),文件有:
- ofbiz.log.? - 記錄所有OFBiz生成日誌信息。此文件將在滿時自動循環創建新文件,即ofbiz.log是當前日誌文件,ofbiz.log.1是較早些時間的日誌文件,ofbiz.log.2是比ofbiz.log.1更早時間的日誌文件,以此類推。
- console.log - 記錄所有OFBiz在控制檯界面運行顯示的內容。也有可能無效。
- access_log.? - 類似於Apache httpd日誌格式記錄所有服務請求。很漂亮但對調試沒有什麼用處。

大多數據時間,你可以通過ofbiz.log或console.log來查詢調試信息。因爲它們有很多內容,所以你最好使用一個可以翻頁與進行查找的編輯器來打開這些日誌文件。


3、查找日誌信息
Java日誌信息最容易查找。它們的日誌信息中通常有類名與行號生成:
111770[PaymentGatewayServices.java:776:INFO ] (Capture) Invoice [#10110] total: 38.54

Minilang方法日誌中的類名均爲Log.java,如:
112499[                Log.java:103:INFO ] Finished quickShipEntireOrder:\nshipmentShipGroupFacilityList=[[shipmentId=10120, facilityId=WebStoreWarehouse, shipGroupSeqId=00001]]\nsuccessMessageList=[Created shipment with ID [10120] for ship group ID [00001] for facility ID [WebStoreWarehouse]]


如果你在beanshell中直接使用輸出,你輸出的內容將顯著的顯示於日誌文件中:
2006-07-19 13:46:26,373 [  ServiceDispatcher.java:450:DEBUG] [[Sync service finished- total:0.027,since last(Begin):0.027]] - 'ecommerce / getProductCategoryAndLimitedMembers'
parentCategory = TABLE-LINENS-SOLIDS
2006-07-19 13:46:26,874 [ PriceServices.java:802:INFO ] PromoPrice and ProductPriceAction had null amount and no default price was available, using list price: 2.0 for product with id 15899

如果你在beanshell中使用調試方法,你將在日誌中得到如下信息:
2006-07-19 13:46:26,373 [  ?:?] parentCategory = TABLE-LINENS-SOLIDS

你可以爲那些無法發現日誌信息的minilang或beanshell代碼中加入自己的信息輸出。

所有freemarker,screen-widget或form widget輸出的信息將直接顯示在你的瀏覽器屏幕上。除非這些控件崩潰否則不會顯示任何日誌信息。

4. 增加你自己的日誌信息
在Java中增加你自己的日誌信息,請使用OFBiz Debug類(org.ofbiz.base.util.Debug)中的調試方法,如logInfo,logWarning, logError...
示例: Debug.logInfo("Now processing invoice " + invoiceId, module);

在beanshell中增加日誌信息,同樣使用Debug方法,但在內容中忽略如""這樣內容。

在freemarker中增加日誌信息,只需要顯示你打算跟蹤的變量,如:
   ${invoice}  <#-- 將顯示 invoice 的一般屬性值-->
${invoice.invoiceId} <#-- 將顯示invoice.invoiceId屬性值 -->


在minilang中增加日誌信息,使用<log >指令並輸入你的值,比如在freemarker中:
   ${invoice}  <#-- will display the entire GenericValue invoice -->
${invoice.invoiceId} <#-- will display the invoiceId field of invoice -->


通常level節點屬性用於設置日誌級別,如:"info", "warning", "error",對應於Debug中的同名方法。


5. 何時需要重啓OFBiz

你在做如下更改時需要重新啓動OFBiz服務器:
- Java文件(記得要重新編譯)
- 配置/.properties文件
- entitymodel或entitygroup XML定義文件
- 服務或secas XML文件
- JPublish XML文件

你在進行以下修改時無需重新啓動OFBiz服務器:
- freemarker FTL模版
- beanshell BSH模版
- Screens XML文件
- Forms XML文件
- 控制器XML文件(注意:在opentaps-0.8和OFBiz 3.x及更早版本中,你在更改控制器時需要重啓)
但有可能你需要在瀏覽器中清除緩存。


6. 常見錯誤及其含義:
Cannot locate service by name (captureBillingAccountPayment)
* 此服務 (captureBillingAccountPayment) 在所有 services.xml 定義中都找不到.
Cannot find service location (org.ofbiz.order.order.OrderServices)
* 說明在services XML定義點上指向的資源不存在. 如果這是一個minilang或beanshell服務,即服務引擎無法找到此文件。如果這是一個Java服務,則說明在classpath中無法查找到這個類。


Service method does not exist (com.opensourcestrategies.financials.invoice.InvoiceServices.setInvoiceDueDate(org.ofbiz.service.DispatchContext, java.util.Map))
* 含義是在某個services.xml指定的這個服務不存在對應的Java方法。通常發生於你在修改了Java文件後忘記再次編譯它來使新增的方法生效。

java.lang.IllegalArgumentException: Could not get next sequenced ID for sequence name: Party (Could not get next sequenced ID for sequence name: Party).
* 系統無法取得實體的下一個自動ID,通常發生於數據庫斷開情況。


ERROR: insert or update on table "inventory_item" violates foreign key constraint "inv_item_facility"
* 在"inventory_item"表的插入/修改操作時違犯"inv_item_facility"外鍵約束。

Error calling event: org.ofbiz.webapp.event.EventHandlerException: Service invocation error (Commit transaction failed)
* 這是一個非常令人討厭的錯誤信息。通常它意味着你訪問的服務所觸發的ECA鏈服務中有一個服務失敗,於是導致全部的操作失敗。服務引擎無法爲你進一步跟蹤,所以你需要進入log文件中進一步查找錯誤原因。訪問你的logs/ofbiz.log 或logs/console.log文件去了解觸發錯誤的根本原因。

Unable to bind UserTransaction/TransactionManager to JNDI
* 這是在opentaps 0.8/0.9及OFBiz的pre-Geronimo版本在Linux系統下可能會發生的一個問題. 解決方法可以在以下網址中找到:
http://lists.ofbiz.org/pipermail/users/2004-June/004094.html

Message: The entity name must immediately follow the '&' in the entity reference.
org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
* 這是一個 XSL:FO 錯誤並意味着你在文本中使了字符'&',比如說你在描述或地址中使了這個字符。 XSL:FO 使用xml屬性格式,所以你需要確認你在文本字段後放置?xml。

本文檔譯自ofbiz 4.0 cookbooks,本人翻譯,歡迎轉載,請註明出處.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章