Как обеспечить бизнес-логику весной на удаленном сервере?
Используя Spring в качестве фреймворка, если мне нужно предоставить услугу бизнес-логики либо JSP / Сервлетам (на веб-серверах), либо клиенту настольных приложений или мобильным клиентам, единственный способ выполнить бизнес-логику(без EJB) на удаленном сервере-это через сервлеты?
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; }
}
Вот и все. Весна позаботится обо всем остальном.