Spring Boot集成Weblogic 12c JMS出现WorkManager重复初始化错误如何解决
解决方案
该需求完全可实现,错误是Weblogic 12c瘦客户端与Spring JMS集成时的经典冲突,核心是Weblogic客户端初始化JNDI上下文/连接时重复触发内部WorkManager初始化导致的断言错误,可通过以下步骤修复:
步骤1:添加JVM启动参数
首先添加启动参数关闭WorkManager重复初始化检查,这是最直接的修复方案:
-Dweblogic.workmanager.skipDuplicateInitCheck=true
如果仍存在冲突,可额外新增两个参数规避初始化逻辑问题:
-Dweblogic.jndi.disableThreadContext=true -Dweblogic.connector.WorkManager=noThreadAffinity
步骤2:替换Weblogic客户端依赖
你当前使用的wlclient.jar是旧版兼容客户端,12c环境建议使用更轻量、冲突更少的wlthint3client.jar(在Weblogic安装目录的server/lib路径下可获取),避免旧客户端的初始化逻辑缺陷。
步骤3:修正现有代码错误
你的现有代码存在两处明显问题:
- JMS接收器类错误使用
@Configuration注解,应该替换为@Component,避免被作为配置类重复初始化 @JmsListener未指定自定义的containerFactory,导致你配置的Weblogic适配工厂未生效,默认工厂会重复创建连接触发冲突
步骤4:优化JMS配置类
调整配置类的Bean注入逻辑,避免重复触发JNDI上下文初始化,修改后的配置如下:
import java.util.Hashtable; import javax.jms.ConnectionFactory; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.support.converter.MappingJackson2MessageConverter; import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.converter.MessageType; @Configuration public class JMSConfig { // 不要把InitialContext做成单例Bean,按需初始化即可 private InitialContext buildInitialContext() throws NamingException { Hashtable<String, String> env = new Hashtable<>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); env.put(Context.PROVIDER_URL, "t3://localhost:9400/"); return new InitialContext(env); } @Bean public ConnectionFactory getConnectionFactory() throws NamingException { return (ConnectionFactory) buildInitialContext().lookup("jms/MyJMSConnectionFactory"); } // 直接通过方法参数注入ConnectionFactory,不要直接调用@Bean方法 @Bean public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setSessionTransacted(true); factory.setMaxMessagesPerTask(1); factory.setConcurrency("1-5"); // 新增缓存级别配置,避免重复创建连接触发WorkManager初始化 factory.setCacheLevel(DefaultJmsListenerContainerFactory.CACHE_CONNECTION); factory.setMessageConverter(jacksonJmsMessageConverter()); return factory; } @Bean public MessageConverter jacksonJmsMessageConverter() { MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); converter.setTargetType(MessageType.TEXT); converter.setTypeIdPropertyName("_type"); return converter; } }
修正后的接收器代码:
import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class JMSReceiver { // 指定自定义的containerFactory @JmsListener(destination = "jms/MyJMSQueue", containerFactory = "myFactory") public void receiveMessage(Shipment msg) { System.out.println("Received Sterling XML: " + msg); } }
内容的提问来源于stack exchange,提问作者Karthikeyan S
相关产品推荐
相关产品推荐

