2011-01-21 4 views
3

есть проблема, которая беспокоит меня, и я не могу найти какой-либо единый способ ее решения в Интернете. Я разрабатываю корпоративное приложение с использованием Java EE, Glassfish и Netbeans.Доступ к EJB без гражданства из другого экземпляра Glassfish

У меня есть два экземпляра Glassfish, и я создаю корпоративное приложение, разделенное между ними. У меня есть веб-страница (с несколькими JSP и несколькими HttpServlets), работающая на одном экземпляре Glassfish. В другом случае я хочу реализовать бизнес-логику приложения. То есть, у меня есть некоторые объекты Java Entity Beans, а также EJB с удаленным интерфейсом, который использует эти сущности.

Моя цель - иметь доступ к EJB удаленно из сервлетов в первом экземпляре стеклянной рыбы. Я выполнил инструкции, приведенные в this post, но безуспешно. Я обеспечиваю фрагменты кода, чтобы получить более конкретные ...

На одном экземпляре Glassfish, удаленного интерфейса объекта EJB:

@Remote 
public interface MyEjbRemote { 
    //... 
} 

и лица без фасоли:

@Stateless(name="ejb/MyEjb") 
public class MyEjb implements MyEjbRemote { 
    //... 
} 

На другом экземпляре:

public class MyServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     MyEjbRemote = lookupEjb(); 
     //... 
    } 

    private MyEjbRemote lookupEjb() { 
     Properties props = new Properties(); 
     props.setProperty("java.naming.factory.initial", 
      "com.sun.enterprise.naming.SerialInitContextFactory"); 
     props.setProperty("java.naming.factory.url.pkgs", 
      "com.sun.enterprise.naming"); 
     props.setProperty("java.naming.factory.state", 
      "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); 

     //default: localhost 
     props.setProperty("org.omg.CORBA.ORBInitialHost", 
      "localhost"); 
     //default: 3700 
     props.setProperty("org.omg.CORBA.ORBInitialPort", "2037"); 

     InitialContext ic = new InitialContext(props); 
     return (MyEjbRemote) ic.lookup("ejb/MyEjb"); 
    } 
} 

К сожалению, когда я запускаю свой сайт и пытаюсь найти удаленный ej b Я получаю следующее исключение:

WARNING: Internal error flushing the buffer in release() 
WARNING: StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw exception 
java.io.IOException: Stream closed 
    at org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:277) 
    at org.apache.jasper.runtime.JspWriterImpl.clearBuffer(JspWriterImpl.java:222) 
    at org.apache.jsp.home_jsp._jspService(home_jsp.java from :76) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:406) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:483) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:373) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:69) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 
    at java.lang.Thread.run(Thread.java:662) 

Что отсутствует в моей реализации? Любые предложения/идеи? Пожалуйста, спросите, не хватает ли чего-либо из описания моей проблемы, это моя первая публикация на этом сайте. Я ценю ваше время!

Ilias

+0

Я изменил свою реализацию, чтобы выполнить инструкции [здесь] (http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#cross-appserverremoteref), но не повезло. Исключения из-за отказа в вводе и также плохой параметр CORBA (org.omg.CORBA.BAD_PARAM) ... – Ilias

ответ

2

Я вижу здесь несколько ошибок.

Наиболее практичным является, вероятно, исключение из страницы JSP и, по-видимому, не имеет ничего общего с сервлетом или доступом к EJB. Оба они не отображаются в трассировке стека. Вероятно, у вас есть JSP под названием . Home.jsp. Он пытается написать ответ, но поток, который его представляет, уже закрыт. Где-то вы делаете что-то неприятное, но это, вероятно, не связано с EJB.

Более теоретическая ошибка заключается в том, что ваш дизайн выглядит как большой анти-шаблон. Использование удаленных вызовов EJB исключительно для «отделения бизнес-логики» - это плохая идея. EXTREMELY. Если вы хотите отделить свою бизнес-логику, просто поместите свои EJB в модуль EJB, ваши сервлеты и JSP в модуле WEB (war) и объедините их вместе в EAR. Используйте локальные интерфейсы. Создание проекта, поддерживающего это, обычно составляет всего несколько кликов в IDE, таких как Netbeans или Eclipse, а производительность и разумность вашего дизайна намного лучше.

Обратите внимание, что удаленные EJBs определенно имеют свое применение, но их следует использовать очень экономно. Используйте их для управления крупнозернистыми заданиями или так на удаленном сервере, где конкретный экземпляр этого сервера имеет определенное значение. Например. у вас может быть один сервер шлюза в вашем кластере, где сообщения (через JMS) помещаются в очередь и обрабатываются в пакете для отправки во внешнюю сеть. Для управления этим удаленным сервером используйте удаленные EJB.

Из описания проблемы На мой вкус, вы хотите использовать этот второй экземпляр Glassfish для «обычной» мелкозернистой бизнес-логики. Если вы на 100% не уверены в том, что вы делаете, и вы на 100% уверены, что ваша конкретная проблема абсолютно необходима для удаленного общения, я настоятельно рекомендую вам отказаться от этой идеи.

+0

Благодарим вас за поучительный ответ arjan! Я должен согласиться со всем, что вы говорите, но я хочу добавить что-то. Изначально мое приложение было именно таким, как вы его описываете, с ejbs и jsps/servlets в одном EAR. и это прекрасно работает :) Дело в том, что я должен трансформировать свою реализацию в несколько распределенной форме, и то, что я пытаюсь сделать в этом посте, касается этого направления. Поэтому я пытаюсь реализовать удаленную службу для моего приложения, чтобы получить доступ, и я подумал, что нужно создать ejb, который что-то делает на другом сервере. Однако вы правы в отношении исключений, но поиск по-прежнему не работает. – Ilias

2

Полная Glassfish 3,1 + Eclipse, Helios + EJB 3.1 Пример

Простой Main.java (SIMPLE Заказчик проекта НЕТ НЕОБХОДИМОСТИ РАЗВЕРТЫВАНИЕ)

Properties props = new Properties(); 
props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory"); 
props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming"); 
props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); 

// optional. Defaults to localhost. Only needed if web server is running 
// on a different host than the appserver 
props.setProperty("org.omg.CORBA.ORBInitialHost", "127.0.0.1"); 
// optional. Defaults to 3700. Only needed if target orb port is not 3700. 
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); 

InitialContext ic = new InitialContext(props); 
GlassfishSessionBeanRemote gRemote = (GlassfishSessionBeanRemote)ic.lookup("java:global/EJBGFish/GlassfishSessionBean!com.example.GlassfishSessionBeanRemote"); 
gRemote.sayHello(); 

EJB Module - ВЫ ДОЛЖНЫ приложить все НИЖЕ ТРЕХ КАК ФАЙЛ JAR (просто запускается как сервер в затмении) - РАЗВЕРТЫВАЕТ

@Stateless 
public class GlassfishSessionBean implements GlassfishSessionBeanRemote, GlassfishSessionBeanLocal { 

    @Override 
    public void sayHello() { 
     System.out.println("First Glassfish App!"); 
    } 

ДИСТАНЦИОННЫЕ И МЕСТНЫЕ ИНТЕРФЕЙСЫ НИЖЕ.

@Remote 
public interface GlassfishSessionBeanRemote { 

    public void sayHello(); 
} 

@Local 
public interface GlassfishSessionBeanLocal { 

    public void sayHello(); 
} 

ВАЖНЕЙШИЕ ВЕЩИ ДЕЛАТЬ:

  1. должны добавить ГФ-Client.jar из GlassFish 3.1 LIB FOLDER на Майне. java class path. (Первый)
  2. ADD EJB PROJECT для пути класса Main.java.
+0

Для ' IIOP', вам не нужно настраивать прослушиватель на 'ORB'? – Thufir

0

Я думаю, вам нужно развернуть проект EJB; После этого вставьте код, как это клиентский проект:

try { 
    Context c = new InitialContext(); 
    HelloRemote z = (HelloRemote) c.lookup("java:global/Pro_EJBModule1/Hello!newpackage.HelloRemote"); 
    System.out.println(z.sayHello("NGA")); 
} catch (NamingException ne) { 
    System.out.println(ne); 
    throw new RuntimeException(ne); 
} 

Pro_EJBModule1 это имя EJB проекта.

0

Соответствующий ответ, который учитывает автономный клиент, а не развернутый, можно найти в this answer as well.

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

  • Нет связанных вопросов^_^