linux安装weblogic报错: End-of-central-directory signature not found.Error during init, error code = 2

用户遇到weblogic启动问题,尝试重新下载安装包解决。文章详细描述了问题的出现、原因分析及解决过程。

 [weblogic@vmbill ~]$ ./server923_linux32.bin -mode=console
[/home/weblogic/server923_linux32.bin]
  End-of-central-directory signature not found.
** Error during init, error code = 2.

 

上网查询未果。

再看了一下server923_linux32.bin的大小,400多M。再看源文件上是600多M。故重新下载。

<think>我们正在处理WebLogic报错:BEA-101267: Failed while destroying filter : websocket filter 这个错误通常发生在WebLogic服务器关闭或重新部署应用时,过滤器销毁过程中出现问题,特别是与websocket相关的过滤器。 可能的原因: 1. 过滤器销毁过程中资源释放失败(如未正确关闭WebSocket连接)。 2. 内存泄漏或线程未正确终止。 3. 过滤器生命周期管理问题(例如,在销毁时还有未完成的异步操作)。 4. WebLogic版本与WebSocket实现(如Tyrus)的兼容性问题。 解决方案: 步骤1:检查日志 - 查看WebLogic的完整日志(包括server.log),寻找与websocket filter相关的其他错误或警告,特别是堆栈跟踪。 步骤2:确保正确关闭WebSocket会话 - 在WebSocket端点的`@OnClose`方法中,确保所有资源(如会话、线程、连接)被正确关闭和释放。 - 示例代码: ```java @OnClose public void onClose(Session session, CloseReason closeReason) { try { if (session.isOpen()) { session.close(closeReason); } } catch (IOException e) { // 记录日志,但不要抛出异常 logger.error("关闭WebSocket会话时出错", e); } // 释放其他资源(如数据库连接、线程池等) } ``` 步骤3:检查过滤器配置 - 在`web.xml`中检查websocket过滤器的配置,确保其与WebLogic版本兼容。 - 考虑使用WebLogic提供的原生WebSocket支持(从12.1.3开始支持),而不是第三方实现。 步骤4:升级WebLogic或Tyrus - 如果使用Tyrus(JSR 356的参考实现),请确保使用与WebLogic兼容的版本。WebLogic 12.1.3及以上版本内置了WebSocket支持,但有时可能需要排除内置模块并部署自己的实现(注意兼容性)。 - 升级Tyrus到最新稳定版,或使用WebLogic内置的WebSocket实现。 步骤5:避免在过滤器中使用实例变量 - 确保过滤器是无状态的,不要在过滤器中存储会话状态。如果必须使用,确保在销毁时正确清理。 步骤6:使用WebLogic的WorkManager管理异步操作 - 如果过滤器中有异步操作,确保在销毁过滤器前等待这些操作完成。可以使用WebLogic的WorkManager来管理这些任务。 步骤7:自定义过滤器销毁逻辑 - 如果问题仍然存在,可以尝试自定义过滤器的销毁逻辑,覆盖`destroy()`方法,确保在销毁时关闭所有WebSocket连接。 - 示例: ```java public class MyWebSocketFilter implements Filter { private Set<Session> sessions = Collections.synchronizedSet(new HashSet<>()); @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 过滤逻辑 if (request instanceof HttpServletRequest) { // 获取WebSocket会话并存储(注意:需要确保线程安全) // 通常不建议在过滤器中存储会话,这里仅作为示例 } chain.doFilter(request, response); } @Override public void destroy() { // 在销毁时关闭所有会话 synchronized (sessions) { for (Session session : sessions) { try { if (session.isOpen()) { session.close(new CloseReason(CloseReason.CloseCodes.GOING_AWAY, "服务器关闭")); } } catch (IOException e) { // 记录日志 } } sessions.clear(); } } } ``` 步骤8:应用部署描述符配置 - 在`weblogic.xml`中配置`container-descriptor`,设置`prefer-web-inf-classes`为`true`,以确保使用应用内的WebSocket实现(如果需要覆盖WebLogic内置的): ```xml <container-descriptor> <prefer-web-inf-classes>true</prefer-web-inf-classes> </container-descriptor> ``` 步骤9:监控和诊断 - 启用WebLogic的详细日志(如启用调试级别日志),重现问题并分析。 - 使用Java内存分析工具(如VisualVM)检查内存泄漏。 总结: - 重点检查资源释放和生命周期管理,特别是WebSocket会话的关闭。 - 确保使用兼容的WebSocket实现版本。 如果以上步骤不能解决问题,请提供完整的错误堆栈和WebLogic版本信息以进一步分析。 §§相关问题§§ 1. WebLogic如何配置WebSocket支持? 2. 如何解决WebLogic中WebSocket连接的内存泄漏问题? 3. WebLogic 12c中如何排除内置的WebSocket模块? 4. 如何监控WebLogic中的WebSocket连接状态?</think>### WebLogic 错误 BEA-101267 解决方案 当 WebLogic 服务器在销毁 WebSocket 过滤器时抛出 **BEA-101267: Failed while destroying filter : websocket filter** 错误,通常由过滤器生命周期管理异常或资源未正确释放引起。以下是完整解决方案: --- ### 错误原因分析 1. **资源未释放**:WebSocket 连接未正确关闭,导致过滤器销毁时资源冲突[^1]。 2. **线程阻塞**:后台线程(如消息监听线程)未终止,阻止过滤器销毁[^2]。 3. **版本兼容性问题**:WebLogic 与 WebSocket 实现库(如 Tyrus)版本不兼容。 4. **部署描述符错误**:`web.xml` 或 `weblogic.xml` 配置冲突。 --- ### 解决方案(按优先级排序) #### 1. 强制关闭 WebSocket 会话(推荐) 在 WebSocket 端点的 `@OnClose` 方法中显式关闭会话: ```java @OnClose public void onClose(Session session, CloseReason reason) { try { if (session != null && session.isOpen()) { session.close(); // 显式关闭会话 } } catch (IOException e) { logger.error("关闭会话失败: " + e.getMessage()); } } ``` **关键点**: - 确保所有会话在应用卸载前关闭[^1]。 - 添加超时机制(如 `session.setMaxIdleTimeout(5000)`)。 --- #### 2. 修复过滤器销毁逻辑 在自定义过滤器的 `destroy()` 方法中清理资源: ```java public class WebSocketFilter implements Filter { private Set<Session> activeSessions = ConcurrentHashMap.newKeySet(); @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { HttpServletRequest request = (HttpServletRequest) req; if (isWebSocketUpgrade(request)) { activeSessions.add(...); // 跟踪会话 } chain.doFilter(req, res); } @Override public void destroy() { activeSessions.forEach(session -> { try { if (session.isOpen()) session.close(); } catch (IOException e) { // 记录日志 } }); activeSessions.clear(); // 清空集合 } } ``` --- #### 3. 版本兼容性调整 | 组件 | 推荐版本 | 配置操作 | |------------------|----------------------------------|--------------------------------------------------------------------------| | **WebLogic** | 12.2.1.4+ 或 14.1.1+ | 升级到[最新补丁集](https://www.oracle.com/middleware/technologies/weblogic-server-downloads.html) | | **Tyrus (JSR 356)** | 2.0.2+ | 在 `pom.xml` 中排除旧版本:<br>```xml<br><exclusion><br> <groupId>org.glassfish.tyrus</groupId><br> <artifactId>tyrus-core</artifactId><br></exclusion>``` | --- #### 4. 配置优化 **在 `weblogic.xml` 中增加销毁超时**: ```xml <container-descriptor> <filter-destroy-timeout-secs>30</filter-destroy-timeout-secs> </container-descriptor> ``` **在 `web.xml` 中声明加载顺序**: ```xml <filter> <filter-name>WebSocketFilter</filter-name> <filter-class>com.example.WebSocketFilter</filter-class> <async-supported>true</async-supported> <!-- 关键配置 --> </filter> ``` --- ### 诊断工具 1. **启用详细日志**: 在 `config.xml` 中添加: ```xml <logger name="weblogic.servlet" level="FINEST"/> <logger name="com.example.websocket" level="DEBUG"/> ``` 2. **线程分析**: 使用 `jstack` 导出线程快照,检查阻塞线程: ```bash jstack <WebLogic_PID> > thread_dump.log ``` --- ### 预防措施 - **资源监控**:部署后检查未关闭会话: ```sql SELECT COUNT(*) FROM V$SESSION WHERE PROGRAM LIKE '%WebLogic%'; ``` - **生命周期测试**:在 `destroy()` 方法中添加日志跟踪。 - **压力测试**:使用 JMeter 模拟高并发连接/断开场景。 --- ### 总结流程 ```mermaid graph TD A[发生 BEA-101267] --> B{检查日志} B --> C[强制关闭会话] B --> D[清理过滤器资源] C --> E[验证版本兼容性] D --> F[调整配置] E --> G[测试部署] F --> G G --> H[问题解决] ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值