【发布时间】: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;
}
}
【问题讨论】: