【问题标题】:java.io.FileNotFoundException: class path resource [/data/nroot/client_key.p12] cannot be opened because it does not existjava.io.FileNotFoundException:类路径资源 [/data/nroot/client_key.p12] 无法打开,因为它不存在
【发布时间】:2020-07-28 03:43:53
【问题描述】:

我已将 Spring-rabbit 版本从 1.7 更新到 2.2.8 以支持 SSL 连接。当我提到密钥存储和信任存储的外部路径(即在 jar 文件之外)时,会引发以下异常。

2:40:53,853 |-ERROR in com.axon.log.dropwizard.AxonAMQPAppender[rabbitmq] - Failed to create customized Rabbit ConnectionFactory. org.springframework.amqp.AmqpIOException: java.io.FileNotFoundException: class path resource [/data/nroot/client_key.p12] cannot be opened because it does not exist
    at org.springframework.amqp.AmqpIOException: java.io.FileNotFoundException: class path resource [/data/nroot/client_key.p12] cannot be opened because it does not exist
    at     at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:70)
    at     at org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean.setUpSSL(RabbitConnectionFactoryBean.java:743)
    at     at org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean.createInstance(RabbitConnectionFactoryBean.java:706)
    at     at org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean.createInstance(RabbitConnectionFactoryBean.java:80)
    at     at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
    at     at org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean.afterPropertiesSet(RabbitConnectionFactoryBean.java:691)
    at     at org.springframework.amqp.rabbit.logback.AmqpAppender.createRabbitConnectionFactory(AmqpAppender.java:710)
    at     at org.springframework.amqp.rabbit.logback.AmqpAppender.start(AmqpAppender.java:675)
    at     at com.axon.log.dropwizard.AmqpAppenderFactory.build(AmqpAppenderFactory.java:373)
    at     at io.dropwizard.logging.DefaultLoggingFactory.configure(DefaultLoggingFactory.java:143)
    at     at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:83)
    at     at io.dropwizard.cli.Cli.run(Cli.java:78)
    at     at io.dropwizard.Application.run(Application.java:93)
    at     at com.infa.products.axon.bulkupload.BulkUploadApplication.main(BulkUploadApplication.java:62)
Caused by: java.io.FileNotFoundException: class path resource [/data/nroot/client_key.p12] cannot be opened because it does not exist
    at     at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:180)
    at     at org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean.configureKeyManagers(RabbitConnectionFactoryBean.java:776)
    at     at org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean.setUpSSL(RabbitConnectionFactoryBean.java:725)
    at     ... 12 common frames omitted
12:40:53,853 |-INFO in ch.qos.logback.classic.AsyncAppender[async-rabbitmq] - Attaching appender named [rabbitmq] to AsyncAppender.
12:40:53,853 |-INFO in ch.qos.logback.classic.AsyncAppender[async-rabbitmq] - Setting discardingThreshold to 51 

我只将 spring-rabbit 更新到 2.2.8.RELEASE。我试图将依赖项更新到最新,但遇到了其他几个问题。然后我只更新了 spring-rabbit 版本以支持 SSL 连接。

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
        compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
        compile 'com.google.code.gson:gson:2.8.1'
        compile group: 'io.dropwizard', name: 'dropwizard-logging', version: '1.1.0'
        compile group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '4.11'
        compile group: 'ch.qos.logback.contrib', name: 'logback-json-classic', version: '0.1.2'
        compile group: 'ch.qos.logback.contrib', name: 'logback-jackson', version: '0.1.5'
        compile group: 'org.springframework.amqp', name: 'spring-rabbit', version: '2.2.8.RELEASE'
        compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
        compile group: 'io.jsonwebtoken', name: 'jjwt', version: '0.8.0'
        compile group: 'org.bitbucket.b_c', name: 'jose4j', version: '0.5.5'
    }

YML 配置条目:

- type: rabbitmq
          host: localhost
          port: 5671
          username: guest
          password: =AXON:CIPHER:AES:128=CrYVHt53/OWVCgAXXrrZ2ufouJwnIdKQzF9VQlSR7NaDE1XpEGPyCznCL57Gpx+RKhrIKR+ytURDzrPv7qw8Rw==
          exchange: axon_log_java
          routingKey: log_routing_key
          appName: Unison
          enabled: true
          secure: true
          tlsVersion: TLSv1.2
          keyStorePassword: MySecretPassword
          trustStorePassword: MySecretPassword
          clientKeyPath: /data/nroot/client_key.p12
          trustStorePath: /data/nroot/rabbitstore
          keyStoreType: PKCS12
          trustStoreType: JKS
          verifyHostname: false

=========== Yml 属性设置为 AMQPAppender:

@JsonTypeName("rabbitmq") 公共类 AmqpAppenderFactory 扩展 AbstractAppenderFactory { ........... ..................... ......

@Override
public Appender build(LoggerContext context, String applicationName, LayoutFactory layoutFactory, LevelFilterFactory levelFilterFactory, AsyncAppenderFactory asyncAppenderFactory) {
    JsonLayout layout = new JsonLayout();
    layout.setJsonFormatter(new JacksonJsonFormatter());
    layout.setAppendLineSeparator(true);
    layout.setTimestampFormatTimezoneId("UTC");
    layout.setIncludeContextName(includeContextName);
    //LayoutWrappingEncoder<ILoggingEvent> layoutEncoder = new LayoutWrappingEncoder<>();
    //layoutEncoder.setLayout(layout);

    final AxonAMQPAppender amqpAppender= new AxonAMQPAppender();
    amqpAppender.setName(appenderName);
    amqpAppender.setContext(context);
    amqpAppender.setLayout(layout);
    amqpAppender.setDeclareExchange(isDeclareExchange());
    amqpAppender.setVirtualHost(getVHost());
    amqpAppender.setHost(getHost());
    amqpAppender.setContentType("application/json");
    amqpAppender.setDurable(isDurable());
    amqpAppender.setGenerateId(isGenerateId());
    amqpAppender.setExchangeType(getExchangeType());
    amqpAppender.setMaxSenderRetries(getMaxRetry());
    amqpAppender.setPassword(getPassword());
    amqpAppender.setUsername(getUsername());
    amqpAppender.setPort(getPort());
    amqpAppender.setRoutingKeyPattern(getRoutingKey());
    amqpAppender.setExchangeName(getExchange());
    amqpAppender.setApplicationId(getAppName());
    amqpAppender.addFilter(levelFilterFactory.build(threshold));
    **amqpAppender.setUseSsl(isSecure());
    amqpAppender.setSslAlgorithm(getTlsVersion());
    amqpAppender.setKeyStore(getClientKeyPath());
    amqpAppender.setKeyStorePassphrase(getKeyStorePassword());
    amqpAppender.setKeyStoreType(getKeyStoreType());
    amqpAppender.setTrustStore(getTrustStorePath());
    amqpAppender.setTrustStorePassphrase(getTrustStorePassword());
    amqpAppender.setTrustStoreType(getTrustStoreType());
    amqpAppender.setVerifyHostname(isVerifyHostname());**

    String command = System.getProperty("centralized.logging");

    if(false == getEnabled() || "false".equals(command)){

        NullAppender nullAppender = new NullAppender();
        nullAppender.setContext(context);
        return wrapAsync(nullAppender,asyncAppenderFactory);
    }
    **amqpAppender.start();**
    return wrapAsync(amqpAppender,asyncAppenderFactory);
}

}

AMQPAppender 类:

public class AxonAMQPAppender extends AmqpAppender {
    
        public static String APP_ID = "";
        public static String SOURCE = "";
    
        @Override
        public Message postProcessMessageBeforeSend(Message message, Event event)
        {
            String body = new String(message.getBody());
            //some line of code
            return message;
    
        }
    }

【问题讨论】:

    标签: spring-amqp spring-rabbit


    【解决方案1】:

    我的问题已经解决了。

    默认情况下,它会查找类路径,或者如果我们指定类路径:即 ClasspathResourceLoader 对于外部文件路径需要指定文件:即它的usesFileUrlResourceLoader

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 2019-09-05
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      相关资源
      最近更新 更多