将Solace WebLogic Resource Adapter打包进EAR部署的问题咨询
我之前也碰到过类似的WebLogic + Solace Resource Adapter(RA)打包部署的问题,因为环境限制没法手动部署RA,只能把它塞进EAR和业务WAR一起发。结合官方文档的要求和实际踩过的坑,给你整理几个关键步骤和常见问题的排查方向:
1. 确保EAR包的结构与配置正确
这是基础,结构不对或者配置缺失直接会导致RA部署失败或者无法被WAR引用:
- EAR目录结构:要把Solace的RAR包放在EAR的根目录或者
lib目录下,同时业务WAR包放在根目录。示例结构:my-app.ear/ ├── solace-jms-ra.rar ├── my-web-app.war ├── META-INF/ │ ├── application.xml │ └── weblogic-application.xml - application.xml配置:需要在这个文件里声明RA模块和Web模块,示例配置:
<application xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="7"> <module> <connector>solace-jms-ra.rar</connector> </module> <module> <web> <web-uri>my-web-app.war</web-uri> <context-root>/my-web-app</context-root> </web> </module> </application> - weblogic-application.xml配置:如果需要自定义RA的连接属性(比如Solace broker地址、用户名密码),可以在这里添加部署参数,或者后续通过WebLogic控制台配置,但打包时提前配置能减少手动操作:
<weblogic-application xmlns="http://xmlns.oracle.com/weblogic/weblogic-application" version="12.2.1"> <module-descriptor> <root-element>connector</root-element> <uri>META-INF/ra.xml</uri> <external-descriptor> <uri>solace-jms-ra.rar/META-INF/weblogic-ra.xml</uri> <module-type>connector</module-type> </external-descriptor> </module-descriptor> <!-- 可选:提前配置连接池参数 --> <resource-description> <res-ref-name>jms/SolaceConnectionFactory</res-ref-name> <jndi-name>eis/SolaceJMSRA</jndi-name> </resource-description> </weblogic-application>
2. 部署后常见的“未明确问题”排查方向
很多时候RA部署成功了,但业务代码用不了,大概率是以下几个点:
- JNDI引用不匹配:WAR里的
resource-ref必须和EAR配置的JNDI名称一致,或者和WebLogic自动生成的RA JNDI名称匹配(WebLogic会给部署的RA自动生成类似eis/solace-jms-ra的JNDI,可在控制台的“部署”->RA详情里查看) - RA连接池初始化失败:检查WebLogic控制台的“连接池”页面,看Solace RA的连接池状态。常见原因是broker地址、用户名密码配置错误,或者网络不通(基础设施防火墙限制)
- 类加载冲突:Solace RA里的JMS API包可能和WebLogic自带的JMS包冲突。可以在
weblogic-application.xml里添加类加载优先级配置,强制使用RA里的类:<prefer-application-packages> <package-name>com.solacesystems.jms.*</package-name> <package-name>com.solacesystems.common.*</package-name> </prefer-application-packages> - 权限不足:WebLogic的服务器用户需要有访问RA连接池的权限。可以在控制台给对应的用户添加“Connector Connection Pool Access”权限。
3. WAR包中正确引用RA的姿势
业务WAR里必须正确声明对RA的引用,否则代码无法lookup到连接工厂:
- web.xml配置:添加
resource-ref声明:<resource-ref> <description>Solace JMS Connection Factory</description> <res-ref-name>jms/SolaceConnectionFactory</res-ref-name> <res-type>javax.jms.ConnectionFactory</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> - weblogic.xml配置:把WAR里的
res-ref-name映射到RA的JNDI名称:<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" version="12.2.1"> <resource-description> <res-ref-name>jms/SolaceConnectionFactory</res-ref-name> <jndi-name>eis/SolaceJMSRA</jndi-name> </resource-description> </weblogic-web-app> - 代码中lookup:用相对路径或者全局JNDI路径lookup,比如:
Context ctx = new InitialContext(); ConnectionFactory cf = (ConnectionFactory) ctx.lookup("java:comp/env/jms/SolaceConnectionFactory");
内容的提问来源于stack exchange,提问作者Alexandru
相关产品推荐
相关产品推荐

