无法注册 MBean 拦截器.WireTap, javax.management.MalformedObjectName



当我为其中一个通道启用 WireTap 拦截器时,我收到以下错误。OotB 窃听拦截器未加载,并在服务器启动期间引发以下异常。弹簧集成版本是3.x

org.springframework.web.context.ContextLoader (ContextLoader.java:319) - 上下文初始化失败 [java] org.springframework.beans.factory.BeanCreationException: 创建在从字节数组加载的资源中定义了名称"exporter"的 bean 时出错:初始化方法的调用失败;嵌套异常是 org.springframework.jmx.export.UnableToRegisterMBeanException: 无法使用密钥 'org.springframework.integration.channel.interceptor.WireTap#0' 注册 MBean [org.springframework.integration.channel.interceptor.WireTap@5596e217];嵌套异常是 javax.management.MalformedObjectNameException:键属性不能为空 [java] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1488) [java] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524) [java] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) [java] at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) [java] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) [java] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) [java] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) [java] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626) [java] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) [java] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) [java] at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389) [java] at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294) [java] at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) [java] at org.broadleafcommerce.common.web.extensibility.MergeContextLoaderListener.contextInitialized(MergeContextLoaderListener.java:50) [java] at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779) [java] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273) [java] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [java] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895) [java] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871) [java] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615) [java] at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:649) [java] at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1585) [java] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [java] at java.util.concurrent.FutureTask.run(FutureTask.java:262) [java] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [java] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [java] at java.lang.Thread.run(Thread.java:745) [爪哇]由:org.springframework.jmx.export.UnableToRegisterMBeanException:无法使用密钥"org.springframework.integration.channel.interceptor.WireTap#0"注册MBean [org.springframework.integration.channel.interceptor.WireTap@5596e217];嵌套异常是 javax.management.MalformedObjectNameException:键属性不能为空 [java] at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:602) [java] at org.springframework.jmx.export.MBeanExporter.registerBeans(MBeanExporter.java:527) [java] at org.springframework.jmx.export.MBeanExporter.afterPropertiesSet(MBeanExporter.java:413) [java] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1547) [java] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1485) [爪哇] ...还有 26 个

我认为此错误发生在 spring-integration v3 中。以下是我解决它的方法。

  • 创建一个扩展 WireTap 的自定义类,定义弹簧豆。
  • 使用 ManagedResource 注释提供名称,这应该与 spring bean 名称匹配。
  • 将拦截器添加到需要分接的通道。

发布此内容后,我能够成功点击该频道。

您不需要重写自定义类中的任何方法,只需添加类似于 WireTap 类的构造函数即可。简而言之,我创建了自己的拦截器类,并用它来点击通道。

@ManagedResource(objectName = "com.xyz.channel.interceptor:name=wireTapExtended") public class WireTapExtended extends WireTap

<int:channel id="channelIdToTap">
<int:interceptors>
<int:ref bean="wireTapExtended" />
</int:interceptors>
</int:channel>
<bean id="wireTapExtended" name="wireTapExtended" class="com.xyz.channel.interceptor.WireTapExtended">
<constructor-arg name="channel" ref="channelIdToTap" />
</bean>

我看到这只是MBean配置

<bean id="jmxExporterSite" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"> <property name="server" ref="mbeanServer" /> <property name="registrationBehaviorName" value="REGISTRATION_REPLACE_EXISTING"/> <property name="beans"> <map> <entry key="SpringBeans:name=hibernateStatisticsMBeanSite" value-ref="hibernateStatisticsMBeanSite" /> <entry key="SpringBeans:name=ehCacheManagerMBean" value-ref="cacheManager" /> </map> </property> </bean>

最新更新