You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:09:04