Jump to content

Glassfish acesso remoto do dominio2 ao dominio1


burncd
 Share

Recommended Posts

Boa noite pessoal.

O dia já vai longo em frente ao computador e deparei-me a esta hora com uma duvida a qual não acho nenhum solução. A situação é a seguinte. Estou a elaborar um projecto que requer ligações remotas de um projecto a outro.

Um deles, o que tem as conexões a Base de dados, está no dominio1 do glassfish e o que vai aceder a este remotamente está no dominio2. Isto porquê... porque os projectos vão estar em computadores diferentes e a maneira mais facil de testar isto é em projectos separados em dominios separados para o obrigar a aceder remotamente um ao outro.

As conexões a BD do projecto1 estão todas OK e 100% funcionais.

O problema é quando tento aceder com o Projecto2 ao 1 deparo-me com a seguinte mensagem.

javax.ejb.EJBException: nested exception is: java.rmi.MarshalException: CORBA MARSHAL 1398079695 No; nested exception is: org.omg.CORBA.MARSHAL:  vmcid: SUN  minor code: 207  completed: No

Segui o tuturial no wiki do netbeans, http://wiki.netbeans.orgCreatingEJB3UsingNetbeansAndGlassfish, como base da ideia para o projecto.

Será que me podem indicar o que possa estar errado? (o ficheiro jndi.properties está igual ao que o tutorial diz)

# To change this template, choose Tools | Templates
# and open the template in the editor.
java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs = com.sun.enterprise.naming
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
org.omg.CORBA.ORBInitialHost = localhost
#optional.  Defaults to 3700.  Only needed if target orb port is not 3700.
org.omg.CORBA.ORBInitialPort = 3700
Link to comment
Share on other sites

Boas pessoal.

Após algumas horas de dedicação e pesquisa sobre a respectiva excepção, descobri então qual é o problema.

No exemplo do website do Netbeans está tudo a funcionar como deve de ser, mas claro que se queremos aceder remotamente do domínio 2 para o domínio 1 vamos ter que ter 2 domínios criados no glassfish e a porta que vai ficar no jndi.properties é a porta que está aberta no domínio que se pretende aceder remotamente. (No meu caso escolhi alojar o projecto que vai ser acedido remotamente no domínio 1 pois a porta é a 3700 tal e qual como no exemplo, sendo assim só copiar e colar as propriedades do jndi.properties na aplicação2).

A minha aplicação que vai ser acedida remotamente não devolve uma string "a força" como no exemplo no wiki do Netbeans, mas sim uma Collection de Employee ou apenas um objecto Employee, requer que esta implemente a interface Serializable.

Classe Employee (Aplicação a ser acedida remotamente)

import java.io.Serializable;
import java.sql.Date;

public class Employee implements Serializable{

    private int identifier;
    private String name;
    private Date submissionDate;
 

Aplicação para Aceder Remotamente

No EJB

jndi.properties

java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs = com.sun.enterprise.naming
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
org.omg.CORBA.ORBInitialHost = localhost
#optional.  Defaults to 3700.  Only needed if target orb port is not 3700.
org.omg.CORBA.ORBInitialPort = 3700
 

Minha servlet, no projecto WEB

import ejb.EmployeeSessionLocal;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class EmployeeServlet extends HttpServlet implements Serializable {

    @EJB
    private EmployeeSessionLocal employeeSessionBean;

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //Employee emp = this.employeeSessionBean.selectOneEmployee(1);
        try {
            ///TODO output your page here
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet EmployeeServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet EmployeeServlet at " + request.getContextPath() + "</h1>");
            for (estg.dae.dao.employees.Employee emp : this.employeeSessionBean.selectEmployees()) {
                out.println(emp.toString());
                out.println("<br/>");
            }
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
Podem reparar que na minha servlet apenas acedo localmente pois a ligação remota é tratada no projecto EJB no SessionBean.

Como tinha referido acima, ao fazer com que a classe Employee implemente a interface Serializable consigo obter os dados do lado da aplicação2.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.