是否有可能从客户端调用服务器上的服务方法,如:
someServiceHolder.getService(MyService.class).runMethodOnServerWithConsumer("myConsumerService#consumerA")
方法然后:
public void runMethodOnServerWithConsumer(String consumerMethodName) {
Consumer<Object> consumerA = somehowGetConsumerInstance(consumerMethodName);
consumerA.accept(doSomething());
}
这可能与Spring无关。也许更一般地说,如何解决序列化方法的不可能性?
答案 0 :(得分:1)
是的,您可以使用RMI(远程方法调用)。 Java远程方法调用允许调用驻留在不同Java虚拟机中的对象。 Spring Remoting允许以更简单,更清洁的方式利用RMI。
您需要在服务器上使用以下代码
@Bean
public RmiServiceExporter exporter(MyService implementation) {
Class<MyService> serviceInterface = MyService.class;
RmiServiceExporter exporter = new RmiServiceExporter();
exporter.setServiceInterface(serviceInterface);
exporter.setService(implementation);
exporter.setServiceName(serviceInterface.getSimpleName());
exporter.setRegistryPort(1099);
return exporter;
}
然后您应该将以下代码添加到您的客户端:
@Bean
public RmiProxyFactoryBean service() {
RmiProxyFactoryBean rmiProxyFactory = new RmiProxyFactoryBean();
rmiProxyFactory.setServiceUrl("rmi://localhost:1099/MyService");
rmiProxyFactory.setServiceInterface(MyService.class);
return rmiProxyFactory;
}
之后,您可以在客户端应用程序上调用所需的方法:
SpringApplication.run(App.class, args).getBean(MyService.class);
service.method("test");
您可以在https://docs.spring.io/spring/docs/2.0.x/reference/remoting.html
上找到更多详情