การค้นหา EJB3 JNDI ล้มเหลวในแอปพลิเคชันไคลเอ็นต์ Java EE

ฉันกำลังพยายามเข้าถึง EJB3 จากแอปพลิเคชันไคลเอนต์ Java EE แต่ไม่ได้รับอะไรเลยนอกจากการค้นหาล้มเหลว แอปพลิเคชันไคลเอ็นต์กำลังทำงานภายใน Java EE Application Client Container

แอปพลิเคชัน Java EE ของฉัน 'CoreServer' กำลังเปิดเผยถั่วจำนวนหนึ่งด้วยอินเทอร์เฟซระยะไกล ฉันไม่มีปัญหาในการเข้าถึงจาก Web Application ที่ใช้งานบน Glassfish v3.0.1 เดียวกัน

ตอนนี้ฉันกำลังพยายามเข้าถึงจากแอปพลิเคชันไคลเอนต์:

public class Main {

  public static void main(String[] args) {
    CampaignControllerRemote bean = null;

    try {
        InitialContext ctx = new InitialContext();
        bean = (CampaignControllerRemote) ctx.lookup("java:global/CoreServer/CampaignController");

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    if (bean != null) {
        Campaign campaign = bean.get(361);
        if (campaign != null) {
            System.out.println("Got "+ campaign);
        }
    }
  }

}

เมื่อฉันรันปรับใช้กับ Glassfish และรันจาก appclient ฉันได้รับข้อผิดพลาดนี้:

Lookup failed for 'java:global/CoreServer/CampaignController' in SerialContext targetHost=localhost,targetPort=3700,orb'sInitialHost=localhost,orb'sInitialPort=3700

อย่างไรก็ตาม นั่นเป็นชื่อ JNDI เดียวกับที่ฉันใช้เมื่อค้นหา bean จาก WebApplication (ผ่าน SessionContext ไม่ใช่ InitialContext - สำคัญไหม) นอกจากนี้ เมื่อฉันปรับใช้ 'CoreServer' Glassfish จะรายงาน:

Portable JNDI names for EJB CampaignController : [java:global/CoreServer/CampaignController!mvs.api.CampaignControllerRemote, java:global/CoreServer/CampaignController]
Glassfish-specific (Non-portable) JNDI names for EJB CampaignController : [mvs.api.CampaignControllerRemote, mvs.api.CampaignControllerRemote#mvs.api.CampaignControllerRemote]

ฉันลองทั้งสี่ชื่อแล้ว แต่ก็ไม่ได้ผล appclient ไม่สามารถเข้าถึง bean ด้วยอินเทอร์เฟซระยะไกล (เท่านั้น) หรือไม่


comment
ฉันขอแนะนำให้คุณเปลี่ยนไปใช้การพึ่งพาการฉีดสำหรับกรณีการใช้งานทั้งสอง... (เว็บแอปและไคลเอนต์แอปของคุณ)   -  person vkraemer    schedule 12.05.2010
comment
การค้นหา CORBA สำเร็จได้อย่างไรด้วยการฉีดการพึ่งพาบนไคลเอนต์แอป คุณช่วยเจาะจงกว่านี้ได้ไหม?   -  person Thufir    schedule 11.03.2015


คำตอบ (3)


หากคุณกำลังพูดถึงแอปพลิเคชันไคลเอ็นต์ให้ใช้คำตอบนี้:

อย่ากังวลกับการค้นหา jndi; คุณสามารถใช้ @EJB การฉีดลงในฟิลด์ static ของคลาสแอปพลิเคชัน

person Brian Leathem    schedule 19.05.2010

คุณได้ลองใช้ java:global/CoreServer/CampaignController!mvs.api.CampaignControllerRemote แทน java:global/CoreServer/CampaignController แล้วหรือยัง

person Ravindra Gullapalli    schedule 19.05.2010

หากคุณกำลังพูดถึงไคลเอนต์แบบสแตนด์อโลน ให้ใช้คำตอบนี้:

นี่คือวิธีที่ฉันใช้สำหรับการค้นหา JNDI สำหรับ glassfish v2 มันอาจจะค่อนข้างคล้ายกันสำหรับ v3:

private void lookupJndi() {
    final Properties props = new Properties();
    props.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming.SerialInitContextFactory");
    String host = "hostname.domain";
    logger.log(Level.INFO, "Connecting to CORBA Host: " + host);
    props.setProperty("org.omg.CORBA.ORBInitialHost", host);
    try {
        InitialContext ic = new InitialContext(props);
        scheduleManager = (ScheduleManagerRemote) ic.lookup("ScheduleManagerRemote");
        experimentManager = (ExperimentManagerRemote) ic.lookup("ExperimentManager");
        facilityManager = (FacilityManagerRemote) ic.lookup("FacilityManager");
    } catch (NamingException e) {
        ...
    }

ส่วนสำคัญคือการได้รับ com.sun INITIAL_CONTEXT_FACTORY ตรวจสอบให้แน่ใจว่าคุณมีการอ้างอิง glassfish ทั้งหมดที่มาพร้อมกับแอปของคุณ สำหรับ glassfish v2 มีเยอะมากครับ ขวด v2 คือ: javaee, appserv-rt, appserv-ext, appserv-admin, appserv-deployment-client

สิ่งต่างๆ อาจจะง่ายกว่ามากด้วย v3 แต่สิ่งนี้ใช้ได้กับ v2.x แน่นอน

person Brian Leathem    schedule 19.05.2010
comment
การรวมการอ้างอิงทั้งหมดแตกต่างจากการใช้ appclient หรือไม่ - person Thufir; 11.03.2015
comment
@Thufir มัน ยาวนาน นับตั้งแต่ฉันดูสิ่งนี้ แต่ IIRC ความแตกต่างกับ appclient เมื่อเปรียบเทียบกับไคลเอนต์แบบสแตนด์อโลนก็คือ appclient เป็นคอนเทนเนอร์ที่ได้รับการจัดการ อินสแตนซ์อ็อบเจ็กต์ของคุณถูกฉีดเข้าไป ชุดการขึ้นต่อกันที่เกี่ยวข้องกันหากแตกต่างกันสำหรับกรณีการใช้งานทั้งสอง - person Brian Leathem; 11.03.2015