ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WebLogic配置JMS消息队列实战:从域到Queue全流程

WebLogic配置JMS消息队列实战:从域到Queue全流程 1. 内容整体设计与思路拆解1.1 先搞清楚 WebLogic 在消息方案里的真实角色严格来说把 WebLogic 叫作消息中间件是有偏差的。WebLogic Server 是 Oracle 的应用服务器核心职责是承载 Java 应用提供 Servlet、EJB、JPA 这类容器能力。它之所以频繁出现在消息中间件的讨论里是因为它内置了一套完整的 JMSJava Message Service实现能创建标准的 Queue、Topic、Connection Factory消息通过 JNDI 对外发布Java 客户端一条连接串就能接入。也就是说装上 WebLogic 等于同时拿到应用容器和一套企业级 JMS 引擎这也是很多 Java 技术栈团队不单独引入 ActiveMQ、RabbitMQ 的原因。把这层关系搞清楚以后本地部署的思路就顺畅多了。我这次要做的是安装一个完整的 WebLogic Server重点激活它内嵌的 JMS 服务让本机和局域网内的其他机器都能稳定地生产和消费消息。这个目标听起来和专职消息中间件没区别但配置路径完全不同专职 MQ 通常改改配置文件、指定 broker 地址即可WebLogic 则必须走完域 → JMS Server → JMS Module → Queue/Connection Factory这条完整链路少任何一环JMS 客户端都找不到目标。所以这篇文章的核心主线不是教你背安装命令而是把这条链路每一环的作用讲透再录一遍完整实操。1.2 整体方案选型单机域、T3 协议与外部访问链路这次需求有代表性本机Windows 11上跑一个 JMS 消息服务局域网里有几台 Linux 业务服务器需要向本机投递消息对接方指定技术栈为 WebLogic协议只允许 T3。T3 是 WebLogic 的私有 RMI/JMS 通信协议默认与应用服务器主端口共用 7001不走单独端口。因此最终方案定为WebLogic Server 12.2.1.4 单机部署创建一个域管理服务器 AdminServer 同时充当 JMS 服务运行节点在域内配置 JMS Server、JMS Module创建队列 OrderQ 和连接工厂 OrderCF将 AdminServer 监听地址从默认回环地址改成本机局域网 IP放通本机 7001 端口的入站规则单独创建消息客户端账号不直接暴露管理账号。没有选择集群的原因很实际验证阶段消息量不大单机管理成本最低而且 WebLogic 的 JMS 集群需要在持久化、负载均衡、故障转移上做大量额外配置没有真实流量压力前投入产出比太差。等消息量真上来了基于现有 JMS Server 横向新增成员节点即可不需要推翻重做。2. 核心细节解析与实操要点2.1 环境准备与版本选择动手前先确认两件事JDK 和 WebLogic 版本。WebLogic 对 JDK 兼容性要求卡得很死12.2.1.4 官方支持 JDK 81.814c 才开始支持 JDK 11/17。我自己用的是 JDK 1.8.0_201 搭配 WebLogic 12.2.1.4这套组合在行业内存量最多遇到问题也最容易搜到现成方案。获取安装包之后安装方式根据本机条件选择。Windows 带图形界面的机器直接运行通用安装器整个安装过程基本是机械式点击没有图形界面的 Linux 系统则用静默安装准备一份 XML 响应文件通过 java -jar fmw_12.2.1.4.0_wls.jar -silent -responseFile 执行。有一个容易踩的低级坑是安装器位数和 JDK 位数不一致32 位 JDK 配 64 位安装器会报一些莫名其妙的异常排查起来相当耗时。建议下载前先确认 JDK 架构有条件就统一用 64 位。另外提醒一句安装目录不要带空格和中文。WebLogic 的启动脚本对路径中的中文字符支持很差曾经有人在 D:\程序\Oracle 下安装启动时直接报 class not found最后只能卸载重装。路径简单、纯英文能省掉以后无数麻烦。2.2 必须提前搞懂的七个核心概念既然用 WebLogic 做 JMS有几个概念不提前吃透控制台里配置时很容易绕晕。挑最核心的七个说域DomainWebLogic 管理配置的顶层单元所有服务器、JMS、数据源都归属在某一个域内一个域至少包含一个管理服务器。管理服务器AdminServer负责控制台管理、配置发布和安全认证。单机部署里 AdminServer 通常既当管理节点又当 JMS 运行节点。JMS Server真正承载消息队列的容器负责消息存储和流转一个 JMS Server 可以挂载多个队列或主题。JMS ModuleJMS 资源的逻辑组织单元把连接工厂、队列按业务打包成一组配置再绑定到目标服务器上。Queue点对点消息队列一条消息只会被一个消费者取走适合任务分发类场景。Connection Factory客户端获取 JMS 连接的关键入口配置时指定 JNDI 名称、协议和连接参数。监听地址Listen Address服务器对外监听的 IP 地址外部访问必须把它改成实际网卡 IP否则外部机器连不进来。端口方面也要转变习惯。专职 MQ 通常有独立端口比如 ActiveMQ 默认 61616、RabbitMQ 默认 5672WebLogic 的 JMS 不额外开端口它的 T3 流量和管理控制台共用 7001SSL 端口是 7002。所以我经常看到有人满世界找JMS 应该监听哪个端口其实根本没有单独端口JMS 就是跟随 AdminServer 主端口走的。3. 实操过程与核心环节实现3.1 本地安装 WebLogic 与创建域安装过程不复杂重点放在事后配置。Windows 11 上执行 java -jar fmw_12.2.1.4.0_wls.jar 后图形向导会询问安装类型、组件和目录。建议完整安装原版的 WebLogic Server 组件不要刻意裁减避免后续创建 JMS 资源时发现某个模板不存在。装完后开始创建域。进入安装目录下的 wlserver/common/bin执行 config.cmd选择Create a new domain。这里有个选择项很关键普通模板只生成一个简装域只有一个 AdminServer适合快速体验我选的是 WebLogic Advanced 模板因为它能在建域时就让你指定 JMS 相关参数和存储位置后面配置更可控。创建域时有两项必须上心。第一项是管理员账号密码建域时设置的密码要是忘了后面改起来要在安全领域里绕一圈非常麻烦第二项是 Server Start 页面的 JDK 主目录必须精确指向本机 JDK 8 的 home 路径。默认 JVM 参数不需要动单机 JMS 场景下默认配置完全够用。域创建完成后目录结构一般是 domains/base_domain。进去 bin 目录执行 startWebLogic.cmd第一次启动会要求输入管理账号密码看到日志出现 Server started in RUNNING mode说明 AdminServer 已经正常起来了。这时候访问 http://localhost:7001/console 就能看到登录页。3.2 配置 JMS 消息服务从 JMS Server 到队列控制台登录进去后配置 JMS 的执行顺序绝不能乱先建 JMS Server再建 JMS Module最后在 Module 里创建队列和连接工厂。顺序对了资源发布的目标关系才能一一对应上。第一步创建 JMS Server。路径是服务 → 消息传递 → JMS 服务器名称我用 JmsServerOrder持久化存储选文件存储。文件存储目录放置在域目录下的 jms_store 子目录这是单机模式下最稳的选择如果业务量不大不建议一开始就接数据库存储会把简单问题复杂化。第二步创建 JMS Module。路径是服务 → 消息传递 → JMS 模块名称 OrderModule目标服务器选 AdminServer。模块创建完成后进入模块详情页的资源页签添加连接工厂和队列。队列名称 OrderQJNDI 名称填 java:/jms/OrderQ连接工厂名称 OrderCFJNDI 名称填 java:/jms/OrderCF。JNDI 名称前缀统一用 java:/jms/是为了避免和系统默认名称空间冲突也方便客户端代码里集中定义。资源创建完后记得做一次状态检查控制台左侧环境 → 服务器 → AdminServer → 监控 → JMS确认队列和连接工厂状态都是已运行。如果状态显示红色异常多数原因要么是 JMS Server 没成功启动要么是文件存储目录权限不对回到 JMS Server 页面重新部署一次即可。3.3 打通外部访问链路IP、端口与认证资源配好了本机用 localhost 发消息没问题但局域网外部机器还连不过来。很多人在这一步卡住其实核心就三件事。第一修改监听地址。控制台左侧环境 → 服务器 → AdminServer → 配置 → 常规把监听地址从空值改成实际本机 IP保存后重启 AdminServer。这一步是外部访问能不能通的根本只改外部访问地址或者主机名都没用不会改变 socket 绑定地址必须改监听地址项本身。第二放通防火墙端口。Windows 下用管理员权限执行netsh advfirewall firewall add rule nameweblogic dirin actionallow protocolTCP localport7001然后在本机执行 netstat -ano | findstr 7001确认监听地址变成了 192.168.1.10:7001 或 0.0.0.0:7001。如果仍然只有 localhost:7001说明监听地址没改成功或服务没重启彻底回到第一步检查。第三创建专用消息账号并赋权。用管理账号 weblogic 登录控制台在安全领域 → myrealm → 用户和组里新建消息用户 jmsuser设置符合复杂度要求的密码。再新建一个组 MessageClients把 jmsuser 加进去只授予 JMS 所需权限不要给管理权。这一步不是为了凑数而是防止外部客户端拿了管理权限后操作控制台安全上必须隔离。最后外部客户端连接时的参数是 t3://192.168.1.10:7001JNDI 查 java:/jms/OrderCF然后查 java:/jms/OrderQ用户名 jmsuser。我在验证阶段写了一个简单的 JMS 收发程序投递 10000 条消息到 OrderQ消费端逐条确认无丢失全程跑完约 3 分钟链路稳定。4. 常见问题与排查技巧实录4.1 常见问题速查表把这次部署中实际遇到和周围同事问得最多的问题整理成一张表方便对照排查。现象可能原因处理办法控制台打不开AdminServer 未启动 / 7001 被其他程序占用检查启动日志netstat 查端口占用并处理外部机器连不上 7001监听地址未改 / 防火墙拦截改 Listen Address 并重启放通防火墙端口JMS 客户端报 NameNotFoundExceptionJNDI 名称写错 / Module 未部署到 AdminServer控制台核对 JNDI 名称确认 Module 目标服务器连接工厂获取时报认证失败消息账号未赋权 / 密码错误检查 myrealm 用户组权限并修正队列状态显示红色JMS Server 未启动 / 存储目录不可读启动 JMS Server修正目录读写权限修改监听地址后本机控制台失联IP 地址填错 / 未重启服务用正确 IP 访问确认后重启4.2 三个典型排查案例第一个案例是典型的配置看着都对但外部连不上。我同事在同一套系统上部署监听地址改成了 localhost 而不是实际 IP他在控制台界面检查了好几轮也没发现问题最后用 netstat 看端口监听情况才暴露。这里有个通用排查顺序外部访问不通先看监听地址再看防火墙最后才怀疑认证和 JNDI顺序不对容易浪费时间。第二个案例是队列创建后客户端找不到。原因在于 JMS Module 的目标没有指向 AdminServer资源根本没发布到运行中的服务器。这个问题的定位其实很容易JMS Module 详情页的目标页签会直接显示是否已部署看到目标为空问题就清楚了。第三个案例是 JNDI 名称大小写不一致引发的问题。Java 客户端里写的是 java:/jms/ordercf控制台资源名是 OrderCF两者严格区分大小写客户端一直报 NameNotFoundException排查了小半天才发现。根治办法是在项目里把 JNDI 名称统一收敛到一个常量类里配置和代码共用一个定义从源头杜绝这种问题。4.3 实操心得与避坑建议按我的经验把 WebLogic 当消息中间件使用最大的阻力其实不在技术操作而在思维模式。习惯专职 MQ 的人思路往往是开一个端口、拿一条连接、收发消息WebLogic 却要求先理解域、JMS Server、JMS Module、目标服务器这些概念任何一步跳过去后续必然绕圈子。所以我建议动手配置前先花半小时把概念捋顺这比急着复制安装命令更有价值。内存方面也值得单独说一句。单机部署默认启动脚本给 JVM 的堆内存往往偏小如果消息量开始变大可以在启动前设置 USER_MEM_ARGS 调高堆内存比如 -Xms1024m -Xmx2048m。但注意不要超过物理内存的一半WebLogic 对过度分配很敏感内存给太多反而容易频繁 Full GC甚至直接 OOM。日志是这个环节最实用的排查入口。启动日志、控制台日志、诊断日志都在域目录 servers/AdminServer/logs 下面。JMS 消费端出现断连时优先看 access.log 和 Diagnostic 日志里 T3 协议通道的异常信息比在控制台界面上反复点击按钮高效得多。最后分享两个实操中的细节。第一连接工厂创建时如果勾选了 XA 事务选项外部客户端代码里必须配套事务管理器否则消息发送会出现难以理解的回滚异常验证阶段千万别开 XA等整条链路确认稳定了再按业务需求加。第二如果后续想在多台机器上快速复现同样环境可以在域目录 bin 下写 wlst.py 脚本用 WebLogic 自带的 WLST 工具把 JMS Server、Module、Queue 的创建全部脚本化换机器时五分钟就能重建一套完全相同配置。这两点是我实际用了多次之后最想留下来的改进一是简化起步二是固化收尾。
返回列表