ZH/Case-Study-01-Journal-33
From ADempiere
This Wiki is read-only for reference purposes to avoid broken links.
Contents
实施日志-33-Bug调试
- 本文属于机械装备制造业进销存实施案例——ADempiere ERP案例研究之一。
- 本文记录ADempiere ERP项目实施的过程
背景说明
- ADempiere还存在一些Bug。当某些Bug影响到正常使用时,自己就得亲自解决了。
- 本文主要关注较为复杂的Bug调试。对于简单的报错或Bug处理,见实施日志-34-报错或Bug简易处理。
2010-01-20-报错-SessionUser <> ContextUser
- 01月17日下午有职员报告 B/S 浏览器端无法录入,检查发现报错。
>>org.adempiere.webui.exception.ApplicationException: Timestamp=Mon Jan 17 16:33:18 PST 2011, Bug 2832968 SessionUser=1000013, ContextUser=1000016. Please report conditions to your system administrator or in sf tracker 2832968
- 把 ad_user_id = 1000006 的记录删去后,不再报错。
- 01月19日通过 Business Partner 窗体 User(Contact) 页签 新增记录之后,类似报错再次出现。这个报错应该是 B/S 浏览器端操作造成的,因为后来我再次删除用户 ad_user_id = 1000061,并通过 C/S 客户端进行了新增用户等操作,类似报错没有出现。
相关链接
具体影响
- 以下描述的问题是用 SuperUser 用户 以 Tongji Admin 角色登录Tongji实体(Client)进行说明的。用 SuperUser 用户 以 Garden Admin 角色 登录 Garden World 实体(Client)也存在同样问题。
- 而且这个错误比较奇怪的地方是还区分实体:
- SuperUser 登录 Tongji 实体,My Profile 窗口显示为 Ms Liu (ad_user_id = 1000061)。
- SuperUser 登录 GardenWorld 实体,My Profile 窗口显示为 Joe Sales。
- SuperUser 登录 System 实体,My Profile 窗口正确显示为 SuperUser。
系统环境
- ADempiere ERP 3.6.0 LTS
- OS: Debian/Linux Squeeze/Testing, amd64
- JVM: Java(TM) SE Runtime Environment (build 1.6.0_22-b04) 64-Bit
- PostgreSQL: 8.4
B/S 浏览器端
- 试图打开窗体时弹出报错提示框,无法打开任何窗体。 截图如下:
- 报错代码如下:
11:48:40,877 ERROR [STDERR] -----------> MIssue.set_ValueNoCheck: ReleaseNo - Value too long - truncated to length=4 [15] 11:48:40,877 ERROR [STDERR] -----------> MIssue.set_ValueNoCheck: ReleaseNo - Value too long - truncated to length=4 [15] 11:48:40,923 ERROR [STDERR] ===========> AbstractADWindowPanel.initPanel: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 [15] org.adempiere.webui.exception.ApplicationException: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 at org.adempiere.webui.panel.AbstractADWindowPanel.initPanel(AbstractADWindowPanel.java:274) at org.adempiere.webui.panel.ADWindowPanel.initPanel(ADWindowPanel.java:218) at org.adempiere.webui.window.ADWindow.doCreatePart(ADWindow.java:79) at org.adempiere.webui.part.AbstractUIPart.createPart(AbstractUIPart.java:41) at org.adempiere.webui.desktop.TabbedDesktop.openWindow(TabbedDesktop.java:113) at org.adempiere.webui.desktop.AbstractDesktop.onMenuSelected(AbstractDesktop.java:66) at org.adempiere.webui.panel.MenuPanel.fireMenuSelectedEvent(MenuPanel.java:236) at org.adempiere.webui.panel.MenuPanel.onEvent(MenuPanel.java:208) at org.zkoss.zk.ui.impl.EventProcessor.process0(EventProcessor.java:197) at org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:141) at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.process0(EventProcessingThreadImpl.java:519) at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.run(EventProcessingThreadImpl.java:446) 11:48:40,924 ERROR [STDERR] ===========> zkoss.handleError:1130: >>org.adempiere.webui.exception.ApplicationException: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 >>org.adempiere.webui.exception.ApplicationException: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 >> at org.adempiere.webui.panel.AbstractADWindowPanel.initPanel(AbstractADWindowPanel.java:274) >> at org.adempiere.webui.panel.ADWindowPanel.initPanel(ADWindowPanel.java:218) >> at org.adempiere.webui.window.ADWindow.doCreatePart(ADWindow.java:79) >> at org.adempiere.webui.part.AbstractUIPart.createPart(AbstractUIPart.java:41) >> at org.adempiere.webui.desktop.TabbedDesktop.openWindow(TabbedDesktop.java:113) >>... [19]
- 浏览器右上角显示用户 Ms Liu,并非当前用户 SuperUser。
C/S 客户端
- 以SuperUser登录实体。
- 打开My Profile窗体,显示的不是当前的登录的用户,而是Ms Liu。截图如下:
- 首先通过 User 窗体、Purchase Order等窗体新增记录。接着打开数据库,在表格 ad_user 和 c_order 的新建记录中,CreatedBy 和 UpdatedBy 字段均记录为 Ms Liu (ad_user_id=1000061),而不是当前用户 SuperUser (ad_user_id=100)。截图如下:
具体调试-Debug
对比代码
- 根据 Heng Sin 的 Tracker 上的修改记录,集中在以下类:
- zkwebui/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java
- zkwebui/WEB-INF/src/org/adempiere/webui/dashboard/DashboardRunnable.java
- zkwebui/WEB-INF/src/org/adempiere/webui/session/SessionContextListener.java
- 针对这三个类,我对比了 trunk 与 360LTS 的代码,代码是相同的。
- 我猜测 Heng Sin 可能只更新了343的代码,于是又对比了 343 与 360LTS 的相关代码,但是看起来 360LTS 的代码更完善一些。
- 于是只好先到这里,再想想其他办法。
跟踪#AD_User_ID
- 通过菜单 Tools --> Preference --> Context,看到 #AD_User_ID == 1000061 。
- 根据 aoslee 的建议,重点查看 #AD_User_ID 为何会变错。
- 于是对 org/compiere/util/Env.java 的 getAD_User_ID() 方法设置断点:
public static int getAD_User_ID (Properties ctx) { return Env.getContextAsInt(ctx, "#AD_User_ID"); } // getAD_User_ID
- 一直跟踪到 getContext(Properties, String)方法:
public static String getContext (Properties ctx, String context) { if (ctx == null || context == null) throw new IllegalArgumentException ("Require Context"); for (int i = 0; i < array.length; i++) { return ctx.getProperty(context, ""); } } // getContext
- 到了 return ctx.getProperty(context, ""); 这一行,就报告 Source not found,指向 java.util.Properties.getProperty(String, String) line: 951。
- 接下来怎么查呢?是否要进一步看java.util.Properties.getProperty的代码?
讨论栏
- 欢迎您在此讨论 ... ...
一楼-看看#AD_User_ID为何会变错吧
- 感觉好像是添加(编辑)用户以后变更了用户间的关联。
- 应该不是session的问题,session如果出问题,很快就会证明,当时我这里的代码页头痛了很久。现在session这块的代码你可以放心使用,应该是没有问题的。
- 查查用户的变更过程,以及关联过程,看看能不能看出什么异常,重点看看为什么superuser变成了ms liu这个非常重要,也许就是解决问题的切入点
- 是不是my profile显示的问题?
- 看看#AD_User_ID这个变量,可能是他引起的问题
- po应该是调用#AD_User_ID作为createdby ,updatedby的值
- 是#AD_User_ID引起的,#AD_User_ID本身指向MsLiu
- 看看#AD_User_ID为何会变错吧,这个就是问题的结症了
-- aoslee 2011-01-21
二楼-Hengsin
- please check whether this help - http://kenai.com/projects/hengsin/sources/development/revision/6655
- try deploy webui as independent war, running isolated from the other legacy adempiere web application ( web store, scheduler, admin, etc ).
Hengsin 15:22, 21 January 2011 (UTC)
三楼-aoslee
- debug这种调试很难看出问题的
- 在getContext函数中,增加是否是#AD_User_ID的判断,然后增加类似如下的话:
logger.warning("sessiontrace:execinit:"+Thread.currentThread());
- 这样会在控制台输出信息,当然也可以输出调用队列,输出什么信息你自己看着来吧。这是以前我写的一个判断,你可以参照一下
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference(); if(!userPreference.getProperty(UserPreference.P_ORG).equals(Env.getAD_Org_ID(ctx)+"")) { logger.warning("sessionorg:"+userPreference.getProperty(UserPreference.P_ORG)+":"+(new Timestamp(System.currentTimeMillis())) +":"+Env.getContext(ctx, "#WSESSIONID")+((HttpSession)currSess.getNativeSession()).getId()); throw new ApplicationException("Env org is error!"); }
- Low Heng Sin的建议很重要。就是不要用posterita 以及 webstore和web版一起用,可能会引起环境变量冲突。
-- aoslee 2011-02-22
链接
About this page
- This page is about debug in ADempiere in Case Study 01, focusing on the complicated cases.
- For the simple cases, please refer to Error & Bug - Simple Cases