如何解决Spring Boot 向 Weblogic JMS 队列发送消息失败,“weblogic.messaging.dispatcher.DispatcherImpl 未导出,或者实际上是 JRMP 存根”
我正在使用 Spring Boot(2.5.0) 开发一种 JMS Sender 框架,它应该适用于任何 JMS 提供者(支持 Java MOM 也应该重用连接工厂)。为此,我所做的是在服务器启动期间创建了一个 bean,它保留所有初始上下文和连接工厂。正确的 JMS 连接工厂(最初在服务器启动期间加载)并使用 jmstemplate 发送消息。它可以正常工作,但是当 JMS 服务器出现故障时,JMS 发送方会抛出此异常 j.e.r.corba.DEFAULT.rpc.encoding : "IOP00500001: (INV_OBJREF) wchar 代码集支持未指定" org.omg.CORBA.INV_OBJREF: IOP01210228:(BAD_OPERATION)此 ORB 实例已被销毁,因此无法对其执行任何操作”
但是当 JMS 服务器重新启动时,我再次尝试使用我的 JMS 发件人代码发布一些消息,这次我检查是否有 JMSException 如果是这样,那么首先我重置连接,然后关闭初始上下文,然后重新创建InitialContext 和 ConnectionFactory 并使用新创建的连接工厂进行进一步的消息发布。但问题是当我使用新创建的连接工厂时,我遇到了以下异常。这似乎是从 Weblogic12c JMS 服务器端发生的。我需要一些指示来解决这个问题,甚至任何可以帮助我调试这个问题的输入也是受欢迎的。
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 异常重新创建 JMS 连接工厂,一旦我解决了这个问题,我将重新考虑这个代码
Spring 配置
public class JmsConfig {
@Autowired
private Environment environment;
@Bean
public YCJmsConfigLoader ycJmsContextLoader() throws NamingException,JMSException {
return new YCJmsConfigLoader(environment);
}
public void resetConectionFactory(String contextName) throws NamingException,JMSException {
YCJmsConfigLoader configLoader = ycJmsContextLoader();
configLoader.resetConnectionFactory(environment,contextName);
}
@Bean
@Scope(value = "prototype")
public Destination destination(@Valid YCDestinationDtl ycDestinationDtl) throws NamingException,JMSException {
try {
Destination destination = (Destination) ycJmsContextLoader()
.getYcJmsConnnectionDtlsmap()
.get(ycDestinationDtl.getContextName())
.getinitialContext()
.lookup(ycDestinationDtl.getDestinationName());
return destination;
}catch(NamingException ex) {
resetConectionFactory(ycDestinationDtl.getContextName());
throw new RuntimeException(ex);
}
}
@Bean
@Scope(value = "prototype")
public JmsSender ycJmsSender() {
return new YCJmsSender();
}
@Bean
@Scope(value = "prototype")
public jmstemplate jmstemplate(String contextName,boolean isTopicTemplate) throws NamingException,JMSException {
jmstemplate jmstemplate = new jmstemplate(ycJmsContextLoader().getYcJmsConnnectionDtlsmap().get(contextName).getCachingConnectionFactory());
if(isTopicTemplate)
{
jmstemplate.setPubSubDomain(true);
}
else{
jmstemplate.setPubSubDomain(false);
}
return jmstemplate;
}
}
服务器启动期间的 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,environment));
}
}
}
}
}
JMS 连接配置持有者
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;
}
}
用于发送消息的 JMS Sender
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,topicName));
getjmstemplate(contextName,true).send(topic,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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。