2017-05-03 61 views
0

我的问题是链接到这个话题Calling Java from PLSQL causing oracle.aurora.vm.ReadOnlyObjectException调用来自Oracle,Java的PLSQL造成oracle.aurora.vm.ReadOnlyObjectException

突然从今天起,我们正在我们的生产错误正在执行Java代码时来自PLSQL,请注意,我们有时会出现这个错误,并且不知道为什么,过去通过删除所有类并重新加载它们解决了问题,但这次不是:

Oracle Database 12c企业版版本12.1.0.2.0 - 64bit制作

java.version = 1.6.0_71

sonic_Client = 8.6.0

PROCEDURE LOG_AND_SEND_TO_QUEUE_PR(
    msg            VARCHAR2, 
    clientID          VARCHAR2, 
    typeMessage          VARCHAR2, 
    providerUrl          VARCHAR2, 
    destination          VARCHAR2, 
    usr            VARCHAR2, 
    pwd            VARCHAR2, 
    isTopic           VARCHAR2, 
    ENABLED_HTTPS_ALGORITHM VARCHAR2) 
AS 
    LANGUAGE JAVA NAME 'jms.cxmessenger.SonicSender.doSend(java.lang.String, java.lang.String,java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)'; 

jms.cxmessenger.SecureTrustManager通过由SonicMQ的客户端所使用系统属性设置。

package jms.cxmessenger; 

import java.security.KeyStore; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 
import java.util.Arrays; 
import java.util.List; 
import java.util.NoSuchElementException; 

import javax.naming.InvalidNameException; 
import javax.naming.NamingException; 
import javax.naming.directory.Attribute; 
import javax.naming.directory.Attributes; 
import javax.naming.ldap.LdapName; 
import javax.naming.ldap.Rdn; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.TrustManagerFactory; 
import javax.net.ssl.X509TrustManager; 

public class SecureTrustManager implements X509TrustManager { 
    private static final X509Certificate[] EMPTY_X509CERTIFICATE_ARRAY = new X509Certificate[0]; 
    private CustomDefaultHostnameVerifier verifier = new CustomDefaultHostnameVerifier(); 

    private TrustManager[] trustManagers; 

    { 
     try { 
      TrustManagerFactory trustManagerFactory = TrustManagerFactory 
        .getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
      trustManagerFactory.init((KeyStore) null); 
      trustManagers = trustManagerFactory.getTrustManagers(); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public void check(X509Certificate[] chain, String authType) throws CertificateException { 
     boolean trusted = false; 
     if (chain.length > 0) { 
      for (TrustManager trustManager : trustManagers) { 
       try { 
        if (trustManager instanceof X509TrustManager) { 
    /* line 43 */  ((X509TrustManager) trustManager).checkServerTrusted(chain, authType);//line 43 
         trusted = true; 
        } 
       } catch (CertificateException e) { 
       } 
      } 
     } 
     if (!trusted && !Boolean.getBoolean("DEACTIVATE_HOSTNAME_VALIDATION")) { 
      checkCN(chain); 
     } 
    } 

    public X509Certificate[] getValidCertificates(X509Certificate[] chain, String peerHost) { 
     return verifier.getValidCertificates(chain, peerHost); 
    } 

    private void checkCN(X509Certificate[] chains) throws CertificateException { 
     if (Boolean.getBoolean("DEBUG")) { 
      System.out.println("checkCN(X509Certificate[] chains) : " + Arrays.toString(chains)); 
     } 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < chains.length; i++) { 
      String cn = extractCN(chains[i].getIssuerX500Principal().getName()); 
      if (cn == null) { 
       sb.append("\n\tFailed to authenticate Server CA : Name = " 
         + chains[i].getIssuerX500Principal().getName()); 
      } else { 
       return; 
      } 
     } 
     if (Boolean.getBoolean("DEBUG")) { 
      System.out.println("sb.toString : " + sb.toString()); 
     } 
     throw new CertificateException(sb.toString()); 
    } 

    private String extractCN(final String subjectPrincipal) { 
     if (subjectPrincipal == null) { 
      return null; 
     } 
     try { 
      final LdapName subjectDN = new LdapName(subjectPrincipal); 
      final List<Rdn> rdns = subjectDN.getRdns(); 
      for (int i = rdns.size() - 1; i >= 0; i--) { 
       final Rdn rds = rdns.get(i); 
       final Attributes attributes = rds.toAttributes(); 
       final Attribute cn = attributes.get("cn"); 
       if (cn != null) { 
        try { 
         final Object value = cn.get(); 
         if (value != null) { 
          return value.toString(); 
         } 
        } catch (final NoSuchElementException ignore) { 
        } catch (final NamingException ignore) { 
        } 
       } 
      } 
     } catch (final InvalidNameException e) { 
     } 
     return null; 
    } 

    @Override 
    public void checkClientTrusted(X509Certificate[] certificates, String paramString) throws CertificateException { 
     for (X509Certificate certificate : certificates) { 
      certificate.checkValidity(); 
     } 
     check(certificates, paramString); 
    } 

    @Override 
    public void checkServerTrusted(X509Certificate[] certificates, String paramString) throws CertificateException { 
     for (X509Certificate certificate : certificates) { 
      certificate.checkValidity(); 
     } 
     check(certificates, paramString); 
    } 

    @Override 
    public X509Certificate[] getAcceptedIssuers() { 
     return trustManagers != null && trustManagers.length > 0 && trustManagers[0] instanceof X509TrustManager 
       ? ((X509TrustManager) trustManagers[0]).getAcceptedIssuers() : EMPTY_X509CERTIFICATE_ARRAY; 
    } 

} 

javax.net.ssl.SSLException:oracle.aurora.vm.ReadOnlyObjectException 在com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java)在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java) 在 的com.sun .net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java) at com.sun.net.ssl.inter nal.ssl.SSLSocketImpl.startHandshake在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java)在(SSLSocketImpl.java) 在jms.cxmessenger.JSSESSLImpl.createSSLSocket(JSSESSLImpl.java) jms.cxmessenger.JSSESSLImpl.createSSLSocket(JSSESSLImpl.java:69)在 progress.message.net.ssl.ProgressSslSocket(ProgressSslSocket.java) 在 progress.message.net.ssl.ProgressSslSocket(ProgressSslSocket.java。: 163) 在 progress.message.net.ssl.ProgressSslSocketFactory.createProgressSocket(ProgressSslSocketFactory.java:172) 在 progress.message.net.ProgressSocketFactory.createProgressSocket(ProgressSocketFactory.java:180) 在 progress.message.zclient.Connection.openSocket(Connection.java:3660) 在 progress.message.zclient.Connection.connectWithRecoveryOpt(Connection.java) 在 progress.message.zclient.ReconnectHelper.connectAndChaseSingleFailoverRedirect(ReconnectHelper的.java:534) 在 progress.message.zclient.ReconnectHelper.connect(ReconnectHelper.java) 在progress.message.zclient.Connection.connect(Connection.java:1585) 在progress.message.jimpl.Connection。 (Connection.java:886)at progress.message.jclient.ConnectionFactory.createConnection(ConnectionFactory.java:2316) at jms.cxmessenger.SonicSender.doSend(SonicSender.java:73)

产生的原因: oracle.aurora.vm.ReadOnlyObjectException在 jms.cxmessenger.SecureTrustManager.check(SecureTrustManager。的java:43) 在 jms.cxmessenger.SecureTrustManager.checkServerTrusted(SecureTrustManager.java) 在 com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java) 在 的com.sun。 net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java) at com.sun.net.ssl。 internal.ssl.Handshaker.process_record(Handshaker.java) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java) 在 com.sun.net.ssl.internal.ssl。小号SLSocketImpl.performInitialHandshake(SSLSocketImpl.java) ...... 16多个

可以将某些一个扶

回答

0

问题是有一些SYS Java类丢失了!

公共同义词在那里,但没有课后面。

解决方案是重新安装SYS Java类,一切顺利!

0

你确定你有正确的罐子版本? 我不希望jms.cxmessenger。*直到cx messenger或sonic 2015(不确定)。 cxmessenger是最新版本。