SpringBoot Log4j2 JMS Appender-> "JMS消息生产者不可用"; [英] SpringBoot Log4j2 JMS Appender -> "JMS message Producer Not Available"

查看:223
本文介绍了SpringBoot Log4j2 JMS Appender-> "JMS消息生产者不可用";的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个SpringBoot应用程序,我正在尝试实现log4j2的JMS Appender. 该应用程序似乎找到了附加程序,但随后出现错误:

I have a SpringBoot App I am trying to implement log4j2's JMS Appender. The app seems to find the appender but then I get an error:

JMS message Producer Not Available

我已经声明了返回类型为org.apache.activemq.ActiveMQConnectionFactory的bean,并在我的log4j2.xml中定义了添加程序和记录器(记录器在RollingFile和Console上正常工作).

I have declared a bean of return type org.apache.activemq.ActiveMQConnectionFactory and defined the appender and logger in my log4j2.xml (the logger works fine to a RollingFile and Console).

我不确定如何解决此问题,在Google上找不到很多.

I am unsure how to resolve this and can't find much on Google.

log4j2.xml附加项:

<JMS name="jmsQueue" 
     destinationBindingName="logQueue"
     factoryBindingName="com.mydomain.developer.myappname.ActiveMQ.MyQueueConnectionFactory"
     factoryName="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
     providerURL="tcp://localhost:61616"
     userName="admin"
     password="admin" >
    <JsonLayout properties="true"/>
</JMS>

我的豆子:

package com.mydomain.developer.myappname.ActiveMQ

import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class MyQueueConnectionFactory{

    @Bean
    public ActiveMQConnectionFactory loggingConnectionFactory(){
        return new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616");
    }
}

StackTrace:

StackTrace:

2018-12-14 12:29:47,421 main ERROR An exception occurred processing Appender jmsQueue org.apache.logging.log4j.core.appender.AppenderLoggingException: Error sending to JMS Manager 'jmsQueue': JMS message producer not available
    at org.apache.logging.log4j.core.appender.mom.JmsManager.send(JmsManager.java:458)
    at org.apache.logging.log4j.core.appender.mom.JmsAppender.append(JmsAppender.java:269)
    at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
    at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:464)
    at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:448)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:431)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:406)
    at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
    at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:146)
    at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2170)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2125)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2108)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2007)
    at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1866)
    at org.apache.commons.logging.LogAdapter$Log4jLog.log(LogAdapter.java:241)
    at org.apache.commons.logging.LogAdapter$Log4jLog.info(LogAdapter.java:205)
    at org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker.postProcessAfterInitialization(PostProcessorRegistrationDelegate.java:330)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:434)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1749)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:576)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:392)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1288)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204)
    at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:91)
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:109)
    at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors(AnnotationAwareAspectJAutoProxyCreator.java:92)
    at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:101)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:253)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1091)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1064)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:487)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:240)
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:707)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
    at ms.allstar.developer.fibresendinboxmessagerequest.FibreSendInboxMessageRequestApplication.main(FibreSendInboxMessageRequestApplication.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:558)
    at java.lang.Thread.run(Thread.java:748)

推荐答案

作为

As the Log4j documentation makes clear, the factoryBindingName in the JMS appender configuration does not refer to a Spring bean. It refers to a JNDI name where the connection factory is bound.

尝试使用如下配置:

<JMS name="jmsQueue" 
     destinationBindingName="dynamicQueues/logQueue"
     factoryBindingName="ConnectionFactory"
     factoryName="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
     providerURL="tcp://localhost:61616"
     userName="admin"
     password="admin">
    <JsonLayout properties="true"/>
</JMS>

需要明确的是,ActiveMQ InitialContextFactory实现仅在客户端执行,这意味着它实际上并未跨网络连接以查找"远程服务器上的资源.而是通常在InitialContext的环境"属性中配置所有资源.但是,默认情况下有一个默认的JMS连接工厂绑定到ConnectionFactory,如果您不想或不能专门配置它,可以在任何队列名称上使用dynamicQueues/前缀.为了方便和简单起见,我建议您使用这些默认资源.

To be clear, the ActiveMQ InitialContextFactory implementation is client-side only meaning it doesn't actually connect across the network to "look up" resources on a remote server. Instead all the resources are typically configured in the "environment" properties of the InitialContext. However, there is a default JMS connection factory bound by default to ConnectionFactory and the dynamicQueues/ prefix can be used on any queue name if you don't want to or can't specifically configure it. I recommend you use these default resources for convenience and simplicity.

这篇关于SpringBoot Log4j2 JMS Appender-> "JMS消息生产者不可用";的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆