春天,如何决定客户应该使用哪个消费者?

时间:2017-10-20 13:40:50

标签: java spring

是否有可能从客户端调用服务器上的服务方法,如:

someServiceHolder.getService(MyService.class).runMethodOnServerWithConsumer("myConsumerService#consumerA")

方法然后:

public void runMethodOnServerWithConsumer(String consumerMethodName) {
 Consumer<Object> consumerA = somehowGetConsumerInstance(consumerMethodName);
  consumerA.accept(doSomething());
}

这可能与Spring无关。也许更一般地说,如何解决序列化方法的不可能性?

1 个答案:

答案 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

上找到更多详情