WebSphere Application Server的SystemOut.log的日志中发现J2CA0075W的警告

本文介绍了解决WebSphere Application Server V5中出现特定日志警告的方法。这些警告源于不受支持的环境中EJB或Servlet衍生线程访问数据库的行为。文章提供了详细的背景信息及如何通过修改配置文件来抑制这些警告。

环境:
产品:WebSphere Application Server(以下简称WAS)
版本:5.0.x 5.1.x
平台:平台无关

问题描述:
用户在WAS V5的SystemOut.log的日志中发现类似如下的错误:
[4/11/03 11:53:41:711 PDT] 891a0 ConnectionMan W J2CA0075W: An active transaction should be present while processing method allocateMCWrapper.
[4/11/03 11:53:41:815 PDT] 891a0 ConnectionMan W J2CA0075W: An active transaction should be present while processing method initializeForUOW.

解答:

这一信息产生的原因是用户使用了不受支持的环境。在J2EE 1.3的规范中禁止EJB自身线程派生出来的线程去访问数据库。但是对于Servlet自身线程派生出来的线程去访问数据库,当前的J2EE 1.3的规范中没有明确是否禁止,所以在WAS V5中我们是允许这种情况发生的。
由于,产品的设计人员不想鼓励这种不受保护的线程去访问数据库,所以当这种情况发生的时候WAS V5将会在日志中产生上面的警告信息。虽然这种信息会充满整个系统日志,但是产品的设计者正是希望如此提醒用户其应用程序存在不合理的设计。用户应该更改程序的不合理设计以消除这些警告信息。
当然,对于不能通过更改应用设计的用户可以通过如下的方法解决这一问题:

1. 用文本编辑器打开如下的文件:
<WAS_HOME>/properties/j2c.properties
*其中<WAS_HOME>代表的是WAS的安装目录

2. 在文件中添加如下的一行:
<logMissingTranContext>false</logMissingTranContext>

Problem
Application gets the following warning messages in the SystemOut.log:

[4/11/03 11:53:41:711 PDT] 891a0 ConnectionMan W J2CA0075W: An active transaction should be present while processing method allocateMCWrapper.
[4/11/03 11:53:41:815 PDT] 891a0 ConnectionMan W J2CA0075W: An active transaction should be present while processing method initializeForUOW.
 
Cause
These messages are being produced due to an "unsupported" environment. When application has spun its own threads from an EJB, accessing a database is not supported (per the J2EE specification). If a Servlet is spinning its own threads and accessing a database, the J2EE specification is not clear on this, so WebSphere Application Server 5.0 will allow it at this time. IBM is working with Sun to clarify this in the specification, so eventually (i.e. J2EE 1.4) spun threads from a Servlet accessing a database outside of a transaction will not be supported either.

Since we don't want to promote the usage of these "naked" threads accessing databases, we are producing the warning messages. Although they may be filling up the logs, we feel that these are necessary to warn the user that they are doing something not in-line with the intended usage. Customers should consider changing their application to comply with the
J2EE specification.

 
Solution
The temporary fix to suppress these warning messages from log file is to modify the file j2c.properties which can be found in the $WAS_HOME/properties directory ($WAS_HOME is the directory where WebSphere Application Server 5.0.x is installed) and
add the following line to the file:

  • <logMissingTranContext>false</logMissingTranContext>

<think>嗯,用户之前已经询问过在WebSphere中使用AspectJWeaver未生效的问题,现在他们遇到了新的情况:SystemOut.log里显示加载了aspectjweaver.jar,但没有AspectJ相关的日志。这说明AspectJ的织入过程可能没有触发,或者日志配置有问题。我需要帮用户分析可能的原因,并提供解决方法。 首先,用户已经按照之前的指导添加了-javaagent参数,并且确认jar包路径正确,但日志里只有加载信息,没有织入过程的日志。这可能意味着AspectJ的代理虽然被加载,但没有正确织入代码,或者日志级别不够,看不到详细信息。 接下来,我需要考虑几个方面: 1. **JVM参数是否正确**:用户可能没有启用AspectJ的详细日志。需要检查是否添加了-Daj.weaving.verbose=true,或者是否有其他参数冲突。 2. **aop.xml配置是否正确**:可能存在路径问题,或者切面定义不正确,导致没有匹配到目标类,因此没有日志输出。 3. **类加载器问题**:虽然之前设置过PARENT_LAST,但可能应用没有正确重启,或者配置未生效,导致AspectJ无法织入目标类。 4. **版本兼容性**:可能使用的AspectJ版本与WebSphere的JDK不兼容,导致代理加载但无法正常工作。 5. **安全管理器限制**:WebSphere的安全策略可能阻止了AspectJ的字节码织入,需要检查安全配置。 6. **依赖冲突**:可能存在多个版本的AspectJ库,导致冲突,代理无法正常工作。 另外,用户可能在尝试调试时,没有正确配置日志,或者日志输出被其他设置覆盖,需要指导用户如何启用更详细的日志,并检查日志位置是否正确。 还需要考虑WebSphere特有的问题,比如应用部署的方式是否影响了类加载,或者是否使用了特定的模块(如EJB)需要额外的配置。比如,如果切面需要织入EJB组件,可能需要额外的配置来允许AspectJ处理这些类。 最后,建议用户提供一个简单的测试用例,比如一个简单的切面和目标类,来验证AspectJ是否正常工作,从而缩小问题范围。</think>--- 在WebSphere的`SystemOut.log`中仅显示`aspectjweaver.jar`已加载,但无AspectJ织入相关日志(如切面匹配、字节码修改记录),可能由以下原因导致。以下是逐步排查和解决方案: --- ### **1. 验证AspectJ调试日志是否启用** - **默认情况下,AspectJ不会输出详细日志**,需显式启用: - 在WebSphere的JVM参数中添加: ```bash -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true ``` - **重启应用**并检查日志中是否出现类似以下内容: ```log [AspectJ] Weaver通知:成功织入类 com.example.ServiceImpl ``` --- ### **2. 检查`aop.xml`配置有效性** - **常见问题**: - `aop.xml`未正确放置在`META-INF`目录下。 - `<aspects>`标签中声明的切面类路径错误。 - `<include>`范围未覆盖目标类(如包名拼写错误)。 - **验证步骤**: 1. 确认`aop.xml`位于部署包(如WAR/EAR)的`META-INF`目录中。 2. 检查切面类名是否全限定且无拼写错误: ```xml <aspect name="com.example.aspect.LoggingAspect"/> <!-- 必须与类路径一致 --> ``` 3. 临时扩大织入范围(测试用): ```xml <include within="*..*"/> <!-- 匹配所有类(仅测试时使用) --> ``` --- ### **3. 确认类加载顺序生效** 即使已设置`PARENT_LAST`,可能因配置未应用导致切面未被加载: 1.WebSphere控制台检查类加载器策略: - **应用程序 → 企业应用程序 → 应用名称 → 类加载和更新检测 → 类加载器顺序** → 确认已设为`PARENT_LAST`。 2. **彻底重启应用**: - 清除WebSphere的临时缓存目录(如`wp_profile/temp`)。 - 重新部署应用并重启服务器。 --- ### **4. 排查JVM参数冲突** - **WebSphere可能覆盖自定义参数**: 检查JVM参数是否被其他配置覆盖: 1. 进入 **服务器 → 服务器类型 → WebSphere应用服务器 → 服务器名称 → 进程定义 → Java虚拟机**。 2. 确保`-javaagent`和`-Daj.weaving.verbose`参数在**通用JVM参数**中正确设置。 - **路径问题**: 若`aspectjweaver.jar`路径包含空格或特殊字符,使用引号包裹: ```bash -javaagent:"C:/Program Files/app/lib/aspectjweaver.jar" ``` --- ### **5. 检查目标类是否被正确加载** AspectJ仅织入类加载器加载的类。若目标类未被加载,则无日志: 1. **强制触发目标类加载**: - 在应用启动时调用目标类的静态方法或初始化块。 2. 使用WebSphere的`verbose类加载`日志: 添加JVM参数: ```bash -Dibm.cl.verbose=com.target.package.* ``` 观察目标类是否被加载。 --- ### **6. 验证AspectJ版本与JDK兼容性** - **版本不兼容会导致静默失败**: | WebSphere版本 | JDK版本 | 推荐AspectJ版本 | |--------------|--------------|----------------| | 8.5.x | Java 6/7 | 1.8.x | | 9.x | Java 8 | 1.9.x | - 使用`java -jar aspectjweaver.jar`检查JAR是否完整。 --- ### **7. 示例场景分析** 假设日志中仅有: ```log [AspectJ] 加载aspectjweaver-1.9.7.jar ``` 但无后续织入日志: - **可能原因**: - 切面未定义在`aop.xml`中。 - 目标类未被类加载器加载(如未调用)。 - `<include>`范围未匹配到目标包。 --- ### **8. 快速测试方法** 编写一个最小化切面验证: 1. **定义简单切面**: ```java @Aspect public class TestAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore() { System.out.println("切面已触发!"); } } ``` 2. **调用目标类方法**: ```java public class ExampleService { public void test() { System.out.println("业务方法执行"); } } ``` 3. 若控制台输出`切面已触发!`,说明AspectJ生效。 --- ### **总结步骤** 1. **启用AspectJ详细日志**并重启。 2. **检查`aop.xml`路径和内容**是否匹配目标类和切面。 3. **确保类加载器策略为`PARENT_LAST`**。 4. **验证目标类是否被加载**。 5. 使用最小化测试用例隔离问题。 通过上述步骤,可定位无织入日志的根本原因。若仍无输出,需检查WebSphere的JDK版本、文件权限及安全策略。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值