Spring boot Spring引导向Weblogic JMS队列发送消息失败,错误为“0”;weblogic.messaging.dispatcher.DispatcherImpl未导出,或实际上是JRMP存根;

Spring boot Spring引导向Weblogic JMS队列发送消息失败,错误为“0”;weblogic.messaging.dispatcher.DispatcherImpl未导出,或实际上是JRMP存根;,spring-boot,weblogic,weblogic12c,spring-jms,jmstemplate,Spring Boot,Weblogic,Weblogic12c,Spring Jms,Jmstemplate,我正在使用springboot(2.5.0)开发一种JMS发送器框架,它应该适用于任何JMS提供者(支持javamom,还应该重用连接工厂)。为此,我所做的只是在服务器启动期间创建了一个bean,它保留了所有初始上下文和连接工厂。因此,每当调用JMS发送器(MyCode)时,它实际上会获取一些参数队列/主题和上下文名称,并找到正确的JMS连接工厂(最初在服务器启动期间加载)并使用JMSTemplate发送消息。它可以正常工作,但当JMS服务器停机时,JMS发送者会抛出此异常 j.e.r.corb

我正在使用springboot(2.5.0)开发一种JMS发送器框架,它应该适用于任何JMS提供者(支持javamom,还应该重用连接工厂)。为此,我所做的只是在服务器启动期间创建了一个bean,它保留了所有初始上下文和连接工厂。因此,每当调用JMS发送器(MyCode)时,它实际上会获取一些参数队列/主题和上下文名称,并找到正确的JMS连接工厂(最初在服务器启动期间加载)并使用JMSTemplate发送消息。它可以正常工作,但当JMS服务器停机时,JMS发送者会抛出此异常 j.e.r.corba.DEFAULT.rpc.encoding:“IOP00500001:(INV_OBJREF)未指定wchar代码集支持”org.omg.corba.INV_OBJREF: IOP101210228:(错误的_操作)此ORB实例已被销毁,因此无法对其执行任何操作“

但是当JMS服务器重新启动时,我再次尝试使用我的JMS发送者代码发布一些消息。这次我检查是否存在JMSException,如果存在,那么首先我重置连接,然后关闭初始上下文,然后重新创建InitialContext和ConnectionFactory,并使用新创建的连接工厂发布更多消息ishing。但问题是,当我使用新创建的连接工厂时,我遇到以下异常。这似乎是从Weblogic12cJMS服务器端发生的。我需要一些指针来解决此问题,甚至可以帮助我调试此问题的任何输入都是受欢迎的

 j.e.resource.corba._CORBA_.util          : IOP00511403: (INV_OBJREF) Class weblogic.messaging.dispatcher.DispatcherImpl not exported, or else is actually a JRMP stub org.omg.CORBA.INV_OBJREF: 
at com.sun.corba.se.impl.logging.UtilSystemException.objectNotExported(UtilSystemException.java:507) [na:1.8.0_221]
at com.sun.corba.se.impl.logging.UtilSystemException.objectNotExported(UtilSystemException.java:530) [na:1.8.0_221]
at com.sun.corba.se.impl.util.Utility.autoConnect(Utility.java:158) [na:1.8.0_221]
at com.sun.corba.se.impl.javax.rmi.CORBA.Util.writeAbstractObject(Util.java:470) [na:1.8.0_221]
at javax.rmi.CORBA.Util.writeAbstractObject(Util.java:159) [na:1.8.0_221]
at com.sun.corba.se.impl.io.IIOPOutputStream.writeObjectOverride(IIOPOutputStream.java:153) [na:1.8.0_221]
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) [na:1.8.0_221]
at weblogic.messaging.dispatcher.DispatcherWrapper.writeExternal(DispatcherWrapper.java:156) [classes/:na]
at weblogic.jms.frontend.FEConnectionCreateRequest.writeExternal(FEConnectionCreateRequest.java:98) [classes/:na]
at com.sun.corba.se.impl.io.IIOPOutputStream.outputObject(IIOPOutputStream.java:554) [na:1.8.0_221]
at com.sun.corba.se.impl.io.IIOPOutputStream.simpleWriteObject(IIOPOutputStream.java:174) [na:1.8.0_221]
at com.sun.corba.se.impl.io.ValueHandlerImpl.writeValueInternal(ValueHandlerImpl.java:236) [na:1.8.0_221]
at com.sun.corba.se.impl.io.ValueHandlerImpl.writeValueWithVersion(ValueHandlerImpl.java:218) [na:1.8.0_221]
at com.sun.corba.se.impl.io.ValueHandlerImpl.writeValue(ValueHandlerImpl.java:150) [na:1.8.0_221]
at com.sun.corba.se.impl.encoding.CDROutputStream_1_0.writeRMIIIOPValueType(CDROutputStream_1_0.java:807) [na:1.8.0_221]
at com.sun.corba.se.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:856) [na:1.8.0_221]
at com.sun.corba.se.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:870) [na:1.8.0_221]
at com.sun.corba.se.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:665) [na:1.8.0_221]
at com.sun.corba.se.impl.encoding.CDROutputStream.write_value(CDROutputStream.java:250) [na:1.8.0_221]
at weblogic.jms.frontend._FEConnectionFactoryRemote_Stub.connectionCreateRequest(Unknown Source) [classes/:na]
at weblogic.jms.client.JMSConnectionFactory.setupJMSConnection(JMSConnectionFactory.java:224) [classes/:na]
at weblogic.jms.client.JMSConnectionFactory.createConnectionInternal(JMSConnectionFactory.java:285) [classes/:na]
at weblogic.jms.client.JMSConnectionFactory.createConnection(JMSConnectionFactory.java:191) [classes/:na]
at org.springframework.jms.connection.SingleConnectionFactory.doCreateConnection(SingleConnectionFactory.java:410) [spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.connection.SingleConnectionFactory.initConnection(SingleConnectionFactory.java:350) [spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.connection.SingleConnectionFactory.getConnection(SingleConnectionFactory.java:328) [spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.connection.SingleConnectionFactory.createConnection(SingleConnectionFactory.java:243) [spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:196) [spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:494) [spring-jms-5.3.6.jar:5.3.6]
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:576) [spring-jms-5.3.6.jar:5.3.6]
at com.yc.common.jms.YCJmsSender.sendToQueue(YCJmsSender.java:43) [classes/:na]
at com.yc.module.item.event.listener.CreateItemSuccessListener.onApplicationEvent(CreateItemSuccessListener.java:38) [classes/:na]
at com.yc.module.item.event.listener.CreateItemSuccessListener.onApplicationEvent(CreateItemSuccessListener.java:1) [classes/:na]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) [spring-context-5.3.6.jar:5.3.6]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) [spring-context-5.3.6.jar:5.3.6]
at org.springframework.context.event.SimpleApplicationEventMulticaster.lambda$multicastEvent$0(SimpleApplicationEventMulticaster.java:140) [spring-context-5.3.6.jar:5.3.6]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_221]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_221]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_221]




 Exception in thread getThreadPoolTaskExecutor-3 java.util.MissingResourceException: No localizer class found for message id.
at weblogic.i18ntools.L10nLookup.getLocalizer(L10nLookup.java:310)
at weblogic.i18ntools.L10nLookup.getLocalizer(L10nLookup.java:261)
at weblogic.i18n.logging.Loggable.getMessage(Loggable.java:187)
at weblogic.i18n.logging.Loggable.getMessage(Loggable.java:211)
at weblogic.jms.common.JMSException.<init>(JMSException.java:66)
at weblogic.jms.client.JMSConnectionFactory.setupJMSConnection(JMSConnectionFactory.java:258)
at weblogic.jms.client.JMSConnectionFactory.createConnectionInternal(JMSConnectionFactory.java:285)
at weblogic.jms.client.JMSConnectionFactory.createConnection(JMSConnectionFactory.java:191)
at org.springframework.jms.connection.SingleConnectionFactory.doCreateConnection(SingleConnectionFactory.java:410)
at org.springframework.jms.connection.SingleConnectionFactory.initConnection(SingleConnectionFactory.java:350)
at org.springframework.jms.connection.SingleConnectionFactory.getConnection(SingleConnectionFactory.java:328)
at org.springframework.jms.connection.SingleConnectionFactory.createConnection(SingleConnectionFactory.java:243)
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:196)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:494)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:576)
at com.yc.common.jms.YCJmsSender.sendToQueue(YCJmsSender.java:43)
at com.yc.module.item.event.listener.CreateItemSuccessListener.onApplicationEvent(CreateItemSuccessListener.java:38)
at com.yc.module.item.event.listener.CreateItemSuccessListener.onApplicationEvent(CreateItemSuccessListener.java:1)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
at org.springframework.context.event.SimpleApplicationEventMulticaster.lambda$multicastEvent$0(SimpleApplicationEventMulticaster.java:140)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
}

服务器启动期间JMS连接配置加载程序Util

public class YCJmsConfigLoader {

private Map<String,YCJmsConfig> ycJmcConDtlsmap;

public Map<String,YCJmsConfig> getYcJmsConnnectionDtlsmap() {
    return ycJmcConDtlsmap;
}

public YCJmsConfigLoader(Environment environment) throws NamingException, JMSException {
    super();
    String contextNameList = environment.getProperty("yc.jms.context.name.list"); //comma separated
    String[] contxtNameArray = contextNameList.split(",");
    for (String contextName : contxtNameArray) {
        if(null==getYcJmsConnnectionDtlsmap()) {
            this.ycJmcConDtlsmap = new HashMap<String, YCJmsConfig>();
        }
        if(environment.getProperty(contextName+".load") == null 
                || "Y".equalsIgnoreCase(environment.getProperty(contextName+".load"))) {
            this.ycJmcConDtlsmap.put(contextName,new YCJmsConfig(contextName,environment));
        }
    }
}

public void resetConnectionFactory(Environment environment, String contextName) throws NamingException, JMSException {
    if(this.getYcJmsConnnectionDtlsmap().containsKey(contextName)) {
        YCJmsConfig ycJmsConfig = this.getYcJmsConnnectionDtlsmap().get(contextName);
        try {               
            ycJmsConfig.getCachingConnectionFactory().resetConnection();
            ycJmsConfig.getInitialContext().close();

        }finally {
                if(environment.getProperty(contextName+".load") == null 
                        || "Y".equalsIgnoreCase(environment.getProperty(contextName+".load"))) {
                    this.getYcJmsConnnectionDtlsmap().put(contextName,new YCJmsConfig(contextName,environment));
                }
        }

    }
}
}

public class YCJmsConfigLoader {

private Map<String,YCJmsConfig> ycJmcConDtlsmap;

public Map<String,YCJmsConfig> getYcJmsConnnectionDtlsmap() {
    return ycJmcConDtlsmap;
}

public YCJmsConfigLoader(Environment environment) throws NamingException, JMSException {
    super();
    String contextNameList = environment.getProperty("yc.jms.context.name.list"); //comma separated
    String[] contxtNameArray = contextNameList.split(",");
    for (String contextName : contxtNameArray) {
        if(null==getYcJmsConnnectionDtlsmap()) {
            this.ycJmcConDtlsmap = new HashMap<String, YCJmsConfig>();
        }
        if(environment.getProperty(contextName+".load") == null 
                || "Y".equalsIgnoreCase(environment.getProperty(contextName+".load"))) {
            this.ycJmcConDtlsmap.put(contextName,new YCJmsConfig(contextName,environment));
        }
    }
}

public void resetConnectionFactory(Environment environment, String contextName) throws NamingException, JMSException {
    if(this.getYcJmsConnnectionDtlsmap().containsKey(contextName)) {
        YCJmsConfig ycJmsConfig = this.getYcJmsConnnectionDtlsmap().get(contextName);
        try {               
            ycJmsConfig.getCachingConnectionFactory().resetConnection();
            ycJmsConfig.getInitialContext().close();

        }finally {
                if(environment.getProperty(contextName+".load") == null 
                        || "Y".equalsIgnoreCase(environment.getProperty(contextName+".load"))) {
                    this.getYcJmsConnnectionDtlsmap().put(contextName,new YCJmsConfig(contextName,environment));
                }
        }

    }
}
public class YCJmsConfig {

private String contextName;

private String initialContextPropName;

private String initialContextPropValue;

private String providerURLPropName;

private String providerURLPropValue;

private String connectionFactoryPropName;

private String connectionFactoryPropValue;

private InitialContext initialContext;

private ConnectionFactory connectionFactory;

private Environment environment;

private CachingConnectionFactory cachingConnectionFactory;


public YCJmsConfig(String contextName, Environment environment) throws NamingException, JMSException {
    super();
    this.environment = environment;
    setContextName(contextName);
    setInitialContextProp();        
    setProviderURLPropName();
    setProviderURLPropValue();
    setConnectionFactoryPropName();
    setConnectionFactoryPropValue();

    setInitialContext();
    setConnectionFactory();
    setCachingConnectionFactory();

}

private void setInitialContextProp() {
    setInitialContextPropName();        
    setInitialContextPropValue();
}

private void setCachingConnectionFactory() throws JMSException {
    CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
    cachingConnectionFactory.setTargetConnectionFactory(getConnectionFactory());
    cachingConnectionFactory.setSessionCacheSize(5);
    cachingConnectionFactory.setCacheProducers(false);
    this.cachingConnectionFactory = cachingConnectionFactory;
}

private void setConnectionFactory() throws NamingException {        
    this.connectionFactory = (ConnectionFactory) getInitialContext().lookup(getConnectionFactoryPropValue());
}

public String getConnectionFactoryPropName() {
    return connectionFactoryPropName;
}

public void setConnectionFactoryPropName() {
    this.connectionFactoryPropName = getContextName()+".connection.factory";
}

public String getConnectionFactoryPropValue() {
    return connectionFactoryPropValue;
}

public void setConnectionFactoryPropValue() {
    this.connectionFactoryPropValue = getEnvironment().getProperty(getConnectionFactoryPropName());
}

private void setProviderURLPropValue() {
    this.providerURLPropValue = getEnvironment().getProperty(getProviderURLPropName());     
}

private void setProviderURLPropName() {
    this.providerURLPropName = getContextName()+".naming.provider.url";     
}

public String getProviderURLPropName() {
    return providerURLPropName;
}

public void setProvderURLPropName(String provderURLPropName) {
    this.providerURLPropName = provderURLPropName;
}

public String getProvderURLPropValue() {
    return providerURLPropValue;
}

public void setProvderURLPropValue(String provderURLPropValue) {
    this.providerURLPropValue = provderURLPropValue;
}

private void setContextName(String contextName) {
    this.contextName = contextName;     
}

public void setInitialContext() throws NamingException{     
    Hashtable<String, String> env = new Hashtable<String, String>();
    env.put(Context.INITIAL_CONTEXT_FACTORY, getInitialContextPropValue());
    env.put(Context.PROVIDER_URL, getProvderURLPropValue());
    //env.put(Context.SECURITY_PRINCIPAL, );
    //env.put(Context.SECURITY_CREDENTIALS, );
    this.initialContext = new InitialContext(env);
}   

public String getInitialContextPropName() {
    return initialContextPropName;
}

public void setInitialContextPropName() {
    this.initialContextPropName = getContextName() + ".naming.factory.initial";
}

public String getInitialContextPropValue() {
    return initialContextPropValue;
}

public void setInitialContextPropValue() {
    this.initialContextPropValue = getEnvironment().getProperty(getInitialContextPropName());
}

public String getContextName() {
    return contextName;
}

public InitialContext getInitialContext() {
    return initialContext;
}

public ConnectionFactory getConnectionFactory() {
    return connectionFactory;
}

public CachingConnectionFactory getCachingConnectionFactory() {
    return cachingConnectionFactory;
}

public Environment getEnvironment() {
    return environment;
}
public class YCJmsSender implements JmsSender{

@Autowired
private YCJmsConfigLoader ycContextLoader;

@Autowired
private BeanFactory beanFactory;

@Autowired
private Environment environemnt;

@Autowired
private final ObjectMapper mapper = new ObjectMapper();

@Override
public void sendToQueue(String contextName, String queueName, String queueJmsPropPrefix, Object object) {
    try {   
        getJmsTemplate(contextName,false).send(getQueue(contextName,queueName)
                , createYCJmsMessage(getYCJmsMessage(mapper.valueToTree(object))
                        , queueJmsPropPrefix));
    }catch(JmsException ex) {
        try {
            ycContextLoader.resetConnectionFactory(this.environemnt, contextName);
        } catch (NamingException|JMSException e) {
            new RuntimeException(e);
        }
        throw new RuntimeException(ex);
    }

}

private JmsTemplate getJmsTemplate(String contextName, boolean isTopicTemplate) {
    return beanFactory.getBean(JmsTemplate.class, contextName,false);
}

private Destination getQueue(String contextName, String queueName) {
    return (Queue) beanFactory.getBean(Destination.class, new YCDestinationDtl(contextName,queueName));
}

@Override
public void sendToTopic(String contextName, String topicName, String topicJmsPropPrefix, Object object) {
    Topic topic = (Topic) beanFactory.getBean(Destination.class, new YCDestinationDtl(contextName,topicName));
    getJmsTemplate(contextName,true).send(topic, createYCJmsMessage(getYCJmsMessage(mapper.valueToTree(object)),topicJmsPropPrefix));

}

private @NotBlank JsonNode getYCJmsMessage(JsonNode jsonMessage) {
    YCJmsMessageModel jmsMessage = new YCJmsMessageModel(new Date(), jsonMessage, "YCJmsSender");
    JsonNode jsonNode = mapper.valueToTree(jmsMessage);
    return jsonNode;
}

private void setMessageProperties(String jmsMsgPropPrefix,Message message) throws JMSException {        
    int priority = Integer.parseInt(environemnt.getProperty(jmsMsgPropPrefix+".jms.priority", "0"));
    message.setJMSPriority(priority);

    String messageType = environemnt.getProperty(jmsMsgPropPrefix+".jms.type", "");
    message.setJMSType(messageType);

    String headerName = environemnt.getProperty(jmsMsgPropPrefix+".header.name", "DEFAULT");
    String headerValue = environemnt.getProperty(jmsMsgPropPrefix+".header.value", "DEFAULT");
    message.setStringProperty(headerName, headerValue);
}

public MessageCreator createYCJmsMessage(JsonNode jsonMessage, @NotBlank String jmsPropPrefix) {
    MessageCreator messageCreator = new MessageCreator() {
        @Id
        private String id;

        @Override
        public Message createMessage(Session session) throws JMSException {
            TextMessage message = session.createTextMessage(jsonMessage.toString());
            message.setJMSMessageID(this.id);
            setMessageProperties(jmsPropPrefix,message);
            return message;
        }
    };
    return messageCreator;
}