2015-08-17 2 views
3

Мне было интересно, есть ли у весны какое-либо решение для поддержки вызова процедуры с использованием конфигурации службы процесса или удаленной службы.Remote/In process service

обновление 1

пример, предположим, что мы имеем следующее:

Общий проект:

public interface ServiceBInterface { 
    boolean doSomething(); 
} 

Проект А (зависит от общего проекта):

@Service 
public class ServiceA { 

    @Autowired 
    private ServiceBInterface serviceB; 

    public void flowA() { 
      // run flow A code 
      boolean result = serviceB.doSomething(); 
      // continue run flow A code with result of service B 
    } 
} 

Проект B (в зависимости от общих условий кт):

@Service 
public class ServiceB implements ServiceBInterface { 
    public boolean doSomething() { 
     boolean result = false; 
     // execute some code 
     return result; 
    } 
} 

я хотел бы иметь возможность настроить ServiceBInterface боб быть инициализированы на следующих вариантах:

  1. Экземпляр ServiceB
  2. Экземпляр какой-то объект, который будет сделать RPC для ServiceB, который работает независимо от другого процесса ServiceA.

Ответ Project A (зависит от общего проекта):

@Service 
    public class ServiceA { 

     @Autowired 
     private ServiceBInterface serviceB; 

@PostConstruct 
    public void init() { 
     if (Boolean.getBoolean("remote")) { 
      RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean(); 
      rmiProxyFactoryBean.setServiceUrl("rmi://localhost:1099/ServiceB"); 
      rmiProxyFactoryBean.setServiceInterface(ServiceBInterface.class); 
      rmiProxyFactoryBean.setRefreshStubOnConnectFailure(true); 
      rmiProxyFactoryBean.setLookupStubOnStartup(false); 

      rmiProxyFactoryBean.afterPropertiesSet(); 
      serviceB = (ServiceBInterface) rmiProxyFactoryBean.getObject(); 
     } 
    } 
     public void flowA() { 
       // run flow A code 
       boolean result = serviceB.doSomething(); 
       // continue run flow A code with result of service B 
     } 
    } 

Проект B (зависит от общего проекта):

@Service 
    public class ServiceB implements ServiceBInterface { 

     RmiServiceExporter rmiServiceExporte; 
@PostConstruct 
public void init() throws RemoteException { 
     if (Boolean.getBoolean("remoteB")) { 
      rmiServiceExporter = new RmiServiceExporter(); 
      rmiServiceExporter.setServiceName("ServiceB"); 
      rmiServiceExporter.setService(serviceB()); 
      rmiServiceExporter.setServiceInterface(ServiceBInterface.class); 
      rmiServiceExporter.setServicePort(9999); 
      rmiServiceExporter.afterPropertiesSet(); 
     } 
    } 
     public boolean doSomething() { 
      boolean result = false; 
      // execute some code 
      return result; 
     } 
    } 
+0

Прочтите справочное руководство, раздел по удалению - это то, что вы хотите, если вы хотите более тщательно использовать поддержку Spring Integration. –

ответ

1

Жаль, что вы вопрос не ясно я, но мне интересно, сможете ли вы найти какую-то помощь для чтения Spring Integration Reference Manual. Например, имеется поддержка RMI, которая представлена ​​в виде пары входящих/исходящих шлюзов для связи с удаленной службой процедуры.

В противном случае, пожалуйста, будьте более конкретными, особенно с образцом кода для решения, которое вы хотели бы достичь.

+0

спасибо, пожалуйста, ознакомьтесь с обновлением 1 на исходном сообщении –

+0

. Справочное руководство, похоже, обеспечивает решение для удаленных вызовов с использованием активатора службы с каким-то канальным протоколом (tcp, amqp и т. Д.). как бы то ни было, если служба находится в контексте одного и того же процесса, она все равно будет использовать канал соединения, и я бы хотел избежать этого, поскольку простой java-вызов будет достаточным, чтобы не было необходимости проходить через канал –