@@ -126,7 +126,7 @@ public class AmqpAppender extends AbstractAppender {
126126 /**
127127 * The template.
128128 */
129- private final RabbitTemplate rabbitTemplate = new RabbitTemplate () ;
129+ private RabbitTemplate rabbitTemplate ;
130130
131131 /**
132132 * Where LoggingEvents are queued to send.
@@ -250,18 +250,12 @@ public static Builder newBuilder() {
250250 * Submit the required number of senders into the pool.
251251 */
252252 private void startSenders () {
253- this .rabbitTemplate .setConnectionFactory (this .manager .connectionFactory );
254253 if (this .manager .async ) {
254+ this .manager .senderPool = Executors .newCachedThreadPool ();
255255 for (int i = 0 ; i < this .manager .senderPoolSize ; i ++) {
256256 this .manager .senderPool .submit (new EventSender ());
257257 }
258258 }
259- else if (this .manager .maxSenderRetries > 0 ) {
260- RetryTemplate retryTemplate = new RetryTemplate ();
261- RetryPolicy retryPolicy = new SimpleRetryPolicy (this .manager .maxSenderRetries );
262- retryTemplate .setRetryPolicy (retryPolicy );
263- this .rabbitTemplate .setRetryTemplate (retryTemplate );
264- }
265259 }
266260
267261 @ Override
@@ -287,6 +281,22 @@ protected Message postProcessMessageBeforeSend(Message message, Event event) {
287281 }
288282
289283 protected void sendEvent (Event event , Map <?, ?> properties ) {
284+ synchronized (this ) {
285+ if (this .rabbitTemplate == null ) {
286+ if (this .manager .activateOptions ()) {
287+ this .rabbitTemplate = new RabbitTemplate (this .manager .connectionFactory );
288+ if (!this .manager .async && this .manager .maxSenderRetries > 0 ) {
289+ RetryTemplate retryTemplate = new RetryTemplate ();
290+ RetryPolicy retryPolicy = new SimpleRetryPolicy (this .manager .maxSenderRetries );
291+ retryTemplate .setRetryPolicy (retryPolicy );
292+ this .rabbitTemplate .setRetryTemplate (retryTemplate );
293+ }
294+ }
295+ else {
296+ throw new AmqpException ("Cannot create template" );
297+ }
298+ }
299+ }
290300 LogEvent logEvent = event .getEvent ();
291301 String name = logEvent .getLoggerName ();
292302 Level level = logEvent .getLevel ();
@@ -352,7 +362,7 @@ protected void doSend(Event event, LogEvent logEvent, MessageProperties amqpProp
352362 message = new Message (msgBody .toString ().getBytes (), amqpProps ); //NOSONAR (default charset)
353363 }
354364 message = postProcessMessageBeforeSend (message , event );
355- this .rabbitTemplate .send (this .manager .exchangeName , routingKey , message );
365+ this .rabbitTemplate .send (this .manager .exchangeName , routingKey , message ); // NOSONAR (sync)
356366 }
357367 catch (AmqpException e ) {
358368 int retries = event .incrementRetries ();
@@ -645,7 +655,7 @@ protected AmqpManager(LoggerContext loggerContext, String name) {
645655 super (loggerContext , name );
646656 }
647657
648- private boolean activateOptions () {
658+ boolean activateOptions () {
649659 ConnectionFactory rabbitConnectionFactory = createRabbitConnectionFactory ();
650660 if (rabbitConnectionFactory != null ) {
651661 Assert .state (this .applicationId != null , "applicationId is required" );
@@ -667,7 +677,6 @@ private boolean activateOptions() {
667677 this .clientConnectionProperties );
668678 }
669679 setUpExchangeDeclaration ();
670- this .senderPool = Executors .newCachedThreadPool ();
671680 return true ;
672681 }
673682 return false ;
@@ -1182,11 +1191,8 @@ public AmqpAppender build() {
11821191 }
11831192
11841193 AmqpAppender appender = buildInstance (this .name , this .filter , theLayout , this .ignoreExceptions , manager , eventQueue );
1185- if (manager .activateOptions ()) {
1186- appender .startSenders ();
1187- return appender ;
1188- }
1189- return null ;
1194+ appender .startSenders ();
1195+ return appender ;
11901196 }
11911197
11921198 /**
0 commit comments