0

Используя NetBeans, я успешно выполнил пример корзины покупок, представленный в учебнике Java EE 6 на веб-сайте Oracle. Это EAR с двумя модулями: модуль EJB и клиентский модуль приложения. Я прервал некоторые детали кода, чтобы сосредоточиться на путаницах, с которыми я сталкиваюсь. Во-первых, ниже приведен код.Смутно об использовании @Remote в EAR

Удаленный интерфейс в модуле EJB

package cart.ejb; 

import cart.util.BookException; 
import java.util.List; 
import javax.ejb.Remote; 

@Remote 
public interface Cart { 
    public void initialize(String person) throws BookException; 

    public void initialize(
    String person, 
    String id) throws BookException; 

    public void addBook(String title); 

    public void removeBook(String title) throws BookException; 

    public List<String> getContents(); 

    public void remove(); 
} 

с состоянием сессионного компонента в модуле EJB

package cart.ejb; 

import cart.util.BookException; 
import cart.util.IdVerifier; 
import java.util.ArrayList; 
import java.util.List; 
import javax.ejb.Remove; 
import javax.ejb.Stateful; 


@Stateful 
public class CartBean implements Cart { 
    List<String> contents; 
    String customerId; 
    String customerName; 

    public void initialize(String person) throws BookException { 
    ................. 
    } 

    public void initialize(
    String person, 
    String id) throws BookException { 
    ..................... 
    } 

    public void addBook(String title) { 
    contents.add(title); 
    } 

    public void removeBook(String title) throws BookException { 
    ................. 
    } 

    public List<String> getContents() { 
    return contents; 
    } 

    @Remove() 
    public void remove() { 
    contents = null; 
    } 
} 

Клиент в модуле клиентского приложения

package cart.client; 

import java.util.Iterator; 
import java.util.List; 
import javax.ejb.EJB; 
import cart.ejb.Cart; 
import cart.util.BookException; 


public class CartClient { 
    @EJB 
    private static Cart cart; 

    public CartClient(String[] args) { 
    } 

    public static void main(String[] args) { 
    CartClient client = new CartClient(args); 
    client.doTest(); 
    } 

    public void doTest() { 
    .................. 
    } 
} 

Теперь мои путаницы начинаются!

Confusion-1: В учебнике говорится, что это удаленный клиент. Но это не так! Он упакован как модуль в пределах того же EAR, что и модуль EJB. Не лучше ли @Local?

Путаница-2: Если GlassFish действительно считать его дистанционную связь между клиентом и бина сеанса, будет контейнер клиента поставить фальшивый экземпляр бина сеанса (т.е. прокси), представляющий фактическую экземпляр бина сеанса в контейнере EJB, как в «реальном» удаленном корпусе? Я имею в виду, удаленный дистанционный, неважно, что?

Confusion-3: Я подумываю о создании клиента в среде, отличной от EE, а затем получаю его для связи с bean-компонентом снаружи EAR, чтобы получить вкус «реального» пульта. Итак, если я запустил Eclipse и создаю клиентскую программу Java SE 7, скопировав содержимое с клиента в EAR, это те изменения, которые я должен внести?

Заменить инъекции зависимостей

@EJB 
private static Cart cart; 

с JNDI

private static Cart cart = (Cart) InitialContext.lookup("java:global/cart/cart-ejb/CartBean/Cart"); 

и добавить исходный код телеге интерфейса в проекте клиента Java Standard Edition.

Confusion-4: Я не могу найти местоположение этого файла EAR. На NetBeans я вижу, что под тележкой есть два файла jar. Но где же файл EAR? Я развернул проект, открыв его непосредственно с C: \ glassfish-4.1.1 \ docs \ javaee-tutorial \ examples \ ejb \ cart с NetBeans.

ответ

0
  1. @Local достаточно, да, очевидно, они были ленивы с демонстрацией и решили упаковать все это в одном.Независимо от того, ваш блок развертывания является областью действия вашего @Local интерфейса, поэтому 2 разных EARS в одном и том же контейнере не могут получить доступ друг к другу @ Локальные интерфейсы

  2. Да и нет: внешнее поведение будет полностью идентичным реальному удаленный корпус (с сериализацией и проксированием объектов), но то, как это действительно обрабатывается за кулисами, зависит от реализации контейнера. Насколько мне известно, большинство контейнеров будут использовать тот факт, что, хотя это @Remote, он находится в одной JVM, поэтому, к примеру, они не будут делать фактическое удаленное соединение сокета.

3.

  • Вам нужны удаленные интерфейсы вашей фасоли
  • Настройки GlassFish для удаленных вызовов на определенном порту с конкретным учетными
  • Выполните поиск JNDI против этой установки
+0

Конкретный порт со специальными полномочиями? Нужно ли это делать, если вместо создания клиентского приложения Java SE я просто вынул клиентский модуль приложения из EAR и запускался как автономный модуль для связи с модулем EJB, который был бы единственным модулем в EAR после того, как я вынул клиента? – softwarelover

+0

Нет, в этом случае вам просто нужно сделать переносной JNDI-поиск из отделенного клиентского приложения (WAR будет делать все отлично, вам не нужно EAR для клиента, но обязательно упакуйте удаленные интерфейсы в нем, предпочтительно, как JAR lib) – highstakes

Смежные вопросы