Как обеспечить бизнес-логику весной на удаленном сервере?


Используя Spring в качестве фреймворка, если мне нужно предоставить услугу бизнес-логики либо JSP / Сервлетам (на веб-серверах), либо клиенту настольных приложений или мобильным клиентам, единственный способ выполнить бизнес-логику(без EJB) на удаленном сервере-это через сервлеты?

4 2

4 ответа:

Это одна из альтернатив. Но ничто не мешает вам создать свой собственный сервер или выполнить работу с контейнером Spring.

Преимущества использования контейнера сервлетов заключаются в том, что вы получаете обработку потоков и сокетов бесплатно. (Это также относится к RMI с сервером RMI)

Преимущества использования фреймворка веб-службы, использующего сервлет, заключаются в том, что вам нужно только обрабатывать и настраивать сгенерированный код. И что он работает со всеми основными технологиями, такими как .NET и PHP, так как это просто XML.

Еще одним преимуществом в среде расширенных операций является то, что сервлет по умолчанию отправляет HTTP-сообщения на порт 80. С жесткими брандмауэрами это самое простое решение.

Например, для связи с RMI требуется два порта.

Если вы заинтересованы в использовании веб-контейнера, такого как Tomcat, на удаленном сервере, вы должны иметь контейнер Spring внутри веб-контейнера.

Но абсолютная простейшая альтернатива, если вы можете жить с Spring в обоих концах должен использоватьSpring invokers вместе с упакованным веб-контейнером Java 6.

С хорошей многослойностью вы можете протестировать весь код бизнес-уровня и уровня интеграции с помощью тестов JUnit! Это очень элегантно!

Нет. Вы можете выставить логику через RMI, Hessian, Burlap, JAX-RPC и т. д.

Не требуется, чтобы службы бизнес-логики на удаленном сервере предоставлялись через сервлет. Открытой службой может быть все, что ваш клиентский код знает, как использовать. Spring предоставляет средства для упрощения некоторых типов связи: RESTful HTTP, SOAP и RMI были бы проще, чем JINI или уникальный проводной протокол.

Как было сказано в предыдущих комментариях, вы всегда можете выставить свою логику через RMI, Hessian/Burlap, JAX-WS/JAX-RPC или даже JMS.

В случае RMI или JMS вам даже не нужно менять свой бизнес-интерфейс, чтобы представить его как удаленный сервис. Это просто вопрос конфигурации.

Например, предположим, что у вас есть бизнес-интерфейс:

 public interface HelloWorld {
    public String getMessage();
  }

И его реализация:

public class SimpleHelloWorld implements HelloWorld {
    public String getMessage() {
       return "Hello World";
    }
}

Чтобы предоставить эту услугу через RMI на локальном хосте в порту 9000, вам нужно добавить следующее фрагмент кода для Spring config:

<?xml version="1.0" encoding="UTF-8"?>
   <beans xmlns="http://www.springframework.org/schema/beans">
       <bean id="helloWorldService"
            class="com.apress.prospring2.ch15.remoting.SimpleHelloWorld"/>
       <bean id="serviceExporter"
             class="org.springframework.remoting.rmi.RmiServiceExporter">
           <property name="serviceName" value="HelloWorld" />
           <property name="service" ref="helloWorldService" />
           <property name="serviceInterface"
               value="com.apress.prospring2.ch15.remoting.HelloWorld" />
            <property name="registryPort" value="9000" />

  </bean>

Ваша конфигурация на стороне клиента должна иметь следующую конфигурацию (appCtx.xml):

  <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans">
       <bean id="helloWorldService"
            class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
          <property name="serviceUrl" value="rmi://localhost:9000/HelloWorld" />
          <property name="serviceInterface"
              value="com.apress.prospring2.ch15.remoting.HelloWorld"/>
       </bean>
       <bean id="helloWorldClient"
            class="com.apress.prospring2.ch15.remoting.rmi.HelloWorldClient">
          <property name="helloWorldService" ref="helloWorldService" />
       </bean>
</beans>

Вот простой клиент:

public class HelloWorldClient {
   private HelloWorld helloWorldService;

   public static void main(String[] args) throws Exception {
      ApplicationContext ctx = new ClassPathXmlApplicationContext("appCtx.xml");
      HelloWorldClient helloWorldClient = 
        (HelloWorldClient) ctx.getBean("helloWorldClient");
      helloWorldClient.run();
   }

   public void run() {
       System.out.println(helloWorldService.getMessage());
  } 
  public void setHelloWorldService(HelloWorld helloWorldService) {
      this.helloWorldService = helloWorldService;
   }

}

Вот и все. Весна позаботится обо всем остальном.