有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Spring引导上下文一直试图连接到JavaRMI服务器,但失败了

首先,我是春天的新手

我正在使用Spring服务来监视电子邮件帐户,并在添加新邮件时进行操作。 我的Spring头代码是:

@Component
public class EmailMonitor implements ApplicationListener<ContextRefreshedEvent> {
    private static final Logger log = LoggerFactory.getLogger(EmailMonitor.class);

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
       // monitor emails
...
}

每当我开始的时候,我都会收到很多页的

"RMI TCP Connection(1)-192.168.1.18: name = \"[Ljava.rmi.server.ObjID;\", codebase = \"\", defaultLoader = jdk.internal.loader.ClassLoaders$PlatformClassLoader@332228c4","logger_name":"sun.rmi.loader"...
...
{"@timestamp":"2021-05-10T17:01:22.212+01:00","@version":"1","message":"RMI TCP Connection(1)-192.168.1.18: name = \"javax.management.ObjectName\", codebase = \"\"","logger_name":"sun.rmi.loader","thread_name":"RMI TCP Connection(1)-192.168.1.18","level":"DEBUG","level_value":10000,"appname":"email-notifier"}
{"@timestamp":"2021-05-10T17:01:22.213+01:00","@version":"1","message":"connectionId=rmi://192.168.1.18  4, name=org.springframework.boot:type=Admin,name=SpringApplication, attribute=Ready","logger_name":"javax.management.remote.rmi","thread_name":"RMI TCP Connection(1)-192.168.1.18","level":"DEBUG","level_value":10000,"appname":"email-notifier"}
{"@timestamp":"2021-05-10T17:01:22.213+01:00","@version":"1","message":"RMI TCP Connection(1)-192.168.1.18: [192.168.1.18] exception: ","logger_name":"sun.rmi.server.call","thread_name":"RMI TCP Connection(1)-192.168.1.18","level":"DEBUG","level_value":10000,"stack_trace":"javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplication\n\tat java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1083)\n\tat java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:637)\n\tat java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(JmxMBeanServer.java:678)\n\tat java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1443)\n\tat java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1307)\n\tat java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1399)\n\tat java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.getAttribute(RMIConnectionImpl.java:637)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:567)\n\tat java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)\n\tat java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)\n\tat java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:691)\n\tat java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)\n\tat java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587)\n\tat java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)\n\tat java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705)\n\tat java.base/java.security.AccessController.doPrivileged(AccessController.java:391)\n\tat java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)\n\tat java.base/java.lang.Thread.run(Thread.java:831)\n","appname":"email-notifier"}
{"@timestamp":"2021-05-10T17:01:22.214+01:00","@version":"1","message":"[javax.management.remote.rmi.RMIConnectionImpl@6d666aa: connectionId=rmi://192.168.1.18  4] closing.","logger_name":"javax.management.remote.rmi","thread_name":"RMI TCP Connection(1)-192.168.1.18","level":"DEBUG","level_value":10000,"appname":"email-notifier"}
{"@timestamp":"2021-05-10T17:01:22.214+01:00","@version":"1","message":"[javax.management.remote.rmi.RMIConnectionImpl@6d666aa: connectionId=rmi://192.168.1.18  4] closed.","logger_name":"javax.management.remote.rmi","thread_name":"RMI TCP Connection(1)-192.168.1.18","level":"DEBUG","level_value":10000,"appname":"email-notifier"}

然后程序结束,这时它应该等待并收听javax电子邮件帐户通知程序

有什么想法吗?我不确定RMI服务器在这个上下文中的角色是什么(我很难找到绑定Spring和RMI的文档引用)。我的理解是Spring将启动它所需的服务,但显然不是在这种情况下


共 (2) 个答案

  1. # 1 楼答案

    我认为您误解了spring上下文侦听器的概念

    Spring应用程序上下文在Spring驱动的应用程序启动期间启动。 它有各种各样的“钩子”——一旦发生,你可以倾听并得到通知。所以,是的,可以刷新上下文,当它发生时,侦听器“激发”并执行代码。但仅此而已,当上下文开始时,它实际上不会做任何有用的事情。例如,您可以阅读上下文事件here

    因此,考虑到这一点,基本上您的应用程序上下文会刷新一次,并且在应用程序启动期间侦听器也只会被调用一次

    现在我不明白RMI服务器是如何与所有这些相关的:)您可以从侦听器中删除@Component注释并重新启动应用程序,它可能仍然会搜索RMI服务器(请尝试并在注释或其他内容中更新)

    所以首先,我想你应该试着理解RMI是如何与所有这些相关的,我认为系统中还有一些其他的组件通过spring boot加载并搜索RMI。也许你可以做一个线程转储或者别的什么,看看哪个线程能真正与RMI一起工作

    要获得“添加邮件时”事件是一件完全不同的事情,您可能必须自己实现它,或者如果与电子邮件一起工作的第三方具有这样的功能,请尝试找到如何使用第三方API实现这一点,但确保它不是ContextRefreshed事件

  2. # 2 楼答案

    要检查电子邮件并对其进行操作,您最好使用Spring集成,它具有现成的email support

    关于你的问题,我怀疑你误解了^{}。它可以用来接收通过Spring的内部事件API触发的事件。它不会像Kafka或JMS的侦听器那样启动侦听器线程。尽管两位听众都有自己的感觉,但他们完全不同

    但是正如前面提到的,使用Spring集成的email support可能会更好,这样可以避免编写自己的代码