如何同时远程连接到多个 Glassfish 4+ 实例?

2024-04-22

我正在寻找一种从基于 Swing 的独立客户端 (JDK7-SE) 同时连接到 Glassfish 4+ (JDK7-EE) 的多个实例的方法。我通过以下方式成功连接到单个实例:

这就是初始上下文的构造:

private void connect(String address, String port) {
    System.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
    System.setProperty("com.sun.corba.ee.transport.ORBTCPTimeouts", "500:30000:20:"+Integer.MAX_VALUE);
    System.setProperty("com.sun.corba.ee.transport.ORBTCPConnectTimeouts", "250:90000:100:"+Integer.MAX_VALUE);
    System.setProperty("com.sun.corba.ee.transport.ORBWaitForResponseTimeout", "300000");
    System.setProperty("java.security.auth.login.config", new File("login.conf").getAbsolutePath());
    System.setProperty("org.omg.CORBA.ORBInitialHost", address);
    System.setProperty("org.omg.CORBA.ORBInitialPort", port);
    InitialContext context = new InitialContext();
}

查找是由 JNDI 使用远程接口完成的:

context.lookup("java:global/LawSuiteEE/LawSuiteEE-ejb/GlobalsFacade!ch.lawsuite.control.GlobalsFacadeRemote");

我正在使用驻留在服务器上并且工作正常的自定义 JDBC 领域。在客户端,我将以下 login.conf 传递到初始上下文(参见上面的代码):

default {
    com.sun.enterprise.security.auth.login.ClientPasswordLoginModule required debug=true;
};

身份验证当前由 ProgrammaticLogin 完成:

private void login(String username, char[] password) {
    ProgrammaticLogin plogin = new ProgrammaticLogin();
    plogin.login(username, password);
}

所有这一切都运行良好!但在独立客户端启动期间,我想同时连接到位于不同服务器上的另一个 EJB。

由于 ProgrammaticLogin 与初始上下文没有直接关系,我不确定如何使用不同的凭据(例如用户名/密码)同时登录两个不同的 Glassfish 服务器?有人有什么想法吗?


对该问题的进一步检查发现,初始上下文只能在每个 JVM 上设置一次。因此,一旦使用 System.setProperty(String, String) 设置 ORB 并实例化初始上下文对象,SerialInitContextFactory 的设计就可以让您不再更改选定的端点。

因此,我决定在不同的 JVM 内连接到不同的 Glassfish 服务器。因此,最终我创建了一个单独的项目,用于管理与应用程序服务器的连接,并通过 RMI 与主项目进行通信。

目前,我的项目由两个我想要同时连接的不同 EE 项目组成,即“LawSuiteEE”和“MgmtCenterEE”。这是处理连接的新项目:

public static void main(String args[]) {
    try {
        if(args.length==2) {
            if(args[1].equals("LawSuiteEE")) {
                ILawSuiteEE stub = (ILawSuiteEE) UnicastRemoteObject.exportObject(new LawSuiteEE(), 0);
                Registry registry = LocateRegistry.createRegistry(Integer.parseInt(args[0]));
                registry.bind("LawSuiteEE", stub);
            } else if(args[1].equals("MgmtCenterEE")) {
                ILawSuiteEE stub = (ILawSuiteEE) UnicastRemoteObject.exportObject(new MgmtCenterEE(), 0);
                Registry registry = LocateRegistry.createRegistry(Integer.parseInt(args[0]));
                registry.bind("MgmtCenterEE", stub);
            } else {
                throw new NumberFormatException();
            }
            Logger.getLogger(RemoteContext.class.getName()).log(Level.INFO, "Remote context service is listening on port "+args[0]+" for incoming requests delegating to "+args[1]+".");
            System.out.println("SIGNAL[READY]");
        } else {
            throw new NumberFormatException();
        }
    } catch (RemoteException ex) {
        System.exit(1);
    } catch (AlreadyBoundException ex) {
        System.exit(2);
    } catch(NumberFormatException ex) {
        System.exit(3);
    }

接口 ILawSuiteEE 用于此项目和主项目之间的 RMI(第二个接口 IMgmtCenterEE 完全相同):

public interface ILawSuiteEE extends IConcurrentDatastore {

    void connect(String address, String port) throws RemoteException;

    void disconnect() throws RemoteException;

    boolean login(String username, char[] password) throws RemoteException;

}

适当的实施:

public class LawSuiteEE implements ILawSuiteEE {

private InitialContext context;
private ProgrammaticLogin login;


@Override
public void connect(String address, String port) throws RemoteException {
    if(context==null) {
        try {
            System.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
            System.setProperty("com.sun.corba.ee.transport.ORBTCPTimeouts", "500:30000:20:"+Integer.MAX_VALUE);
            System.setProperty("com.sun.corba.ee.transport.ORBTCPConnectTimeouts", "250:90000:100:"+Integer.MAX_VALUE);
            System.setProperty("com.sun.corba.ee.transport.ORBWaitForResponseTimeout", "300000");
            System.setProperty("java.security.auth.login.config", new File("login.conf").getAbsolutePath());
            System.setProperty("org.omg.CORBA.ORBInitialHost", address);
            System.setProperty("org.omg.CORBA.ORBInitialPort", Integer.toString(port));
            Logger.getLogger(RemoteDatastore.class.getName()).log(Level.INFO, "Try to connect to application server at "+System.getProperty("org.omg.CORBA.ORBInitialHost")+":"+System.getProperty("org.omg.CORBA.ORBInitialPort")+" ...");            
            context = new InitialContext();
        } catch (NamingException ex) {
            throw new RemoteException(ex.getMessage());
        }
    }
}

@Override
public void disconnect() throws RemoteException {
    if(context!=null) {
        try {
            context.close();
            Logger.getLogger(LawSuiteEE.class.getName()).log(Level.INFO, "Server context successfully closed.");
        } catch (NamingException ex) {
            Logger.getLogger(LawSuiteEE.class.getName()).log(Level.SEVERE, "Couldn't close server context.");
        } finally {
            this.facades.clear();
            this.services.clear();
            this.context=null;
        }
    }
}

@Override
public boolean login(String username, char[] password) throws RemoteException {
    login = new ProgrammaticLogin();
    return login.login(username, password);
}

}

在主项目中,我将连接以下内容:

public class LawSuiteDatastore extends Thread implements ILawSuiteEE {

    private int port;
    private int trials;
    private boolean ready;
    private Process process;
    private ILawSuiteEE stub;

    public LawSuiteDatastore() {
        this.setName("K+: Remote-Datastore-Connection");
        this.port = RemoteDatastoreService.cport++;
    }

    @Override
    public void run() {
        try {
            Tools.log(RemoteDatastoreService.class, Level.INFO, "Starting RMI registry on port "+port+" for connecting to LawSuiteEE server instance.");
            this.process = Runtime.getRuntime().exec(new String[] {"java", "-jar", Context.getWorkingDirectory()+"/lib/LawSuiteSX.jar", Integer.toString(port), "LawSuiteEE"});
            //<editor-fold defaultstate="collapsed" desc="Redirect Error Stream">
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        try(DataInputStream in = new DataInputStream(process.getErrorStream())) {
                            BufferedReader br = new BufferedReader(new InputStreamReader(in));
                            String line;
                            while((line=br.readLine())!=null) {
                                Tools.log(RemoteDatastoreService.class, Level.SEVERE, line);
                            }
                        }
                    } catch(Exception ex){
                        Tools.log(MgmtCenterDatastore.class, Level.SEVERE, ex.getMessage());
                    }
                }
            }).start();
            //</editor-fold>
            //<editor-fold defaultstate="collapsed" desc="Redirect Output Stream">
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        try(DataInputStream in = new DataInputStream(process.getInputStream())) {
                            BufferedReader br = new BufferedReader(new InputStreamReader(in));
                            String line;
                            while((line=br.readLine())!=null)   {
                                if(line.contains("SIGNAL[READY]")) { ready=true; }
                                Tools.log(RemoteDatastoreService.class, Level.INFO, line);
                            }
                        }
                    } catch(Exception ex){
                        Tools.log(MgmtCenterDatastore.class, Level.SEVERE, ex.getMessage());
                    }
                }
            }).start();
            //</editor-fold>
            // keep thread alive as long process is alive
            if(process.waitFor()>0) {
                // port was already bound
                if(process.exitValue()==2) {
                    // try it with a different port and start over again
                    if(trials<3) {
                        process = null;
                        port = ++RemoteDatastoreService.cport;
                        trials++;
                        if(trials<3) {
                            start();
                        }
                    }
                }
            }
        } catch (IOException ex) {
            Tools.log(RemoteDatastoreService.class, Level.SEVERE, ex.getMessage());
        } catch (InterruptedException ex) {
            Tools.log(RemoteDatastoreService.class, Level.SEVERE, ex.getMessage());
        }
    }

    public boolean isReady() {
        return ready;
    }

    public int getTrials() {
        return trials;
    }

    @Override
    public void connect(RemoteDatastore datastore) throws RemoteException {
        try {
            Tools.log(RemoteDatastoreService.class, Level.INFO, "Locating RMI registry on port "+port+" for connecting to LawSuiteEE server instance.");
            Registry registry = LocateRegistry.getRegistry(port);
            stub = (ILawSuiteEE)registry.lookup("LawSuiteEE");
            stub.connect(datastore);
        } catch (NotBoundException ex) {
            Logger.getLogger(RemoteDatastoreService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void disconnect() throws RemoteException {
        if(process!=null && stub!=null) {
            stub.disconnect();
            process.destroy();
        } else {
            throw new RemoteException("Remote RMI server is not ready.");
        }
    }

    @Override
    public boolean login(String username, char[] password) throws RemoteException {
        if(process!=null && stub!=null) {
            return stub.login(username, password);
        } else {
            throw new RemoteException("Remote RMI server is not ready.");
        }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何同时远程连接到多个 Glassfish 4+ 实例? 的相关文章

  • createImage(int width, int height) 的问题

    我有以下代码 作为游戏的一部分每 10 毫秒运行一次 private void gameRender if dbImage null createImage returns null if GraphicsEnvironment isHea
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐

  • ruby yaml ypath 和 xpath 一样吗?

    你好 我有一个像这样的 yaml 文件 data date 2004 06 11 description First description date 2008 01 12 description Another descripion 我如
  • Corda 流的任一侧可以存在于单独的 Cordapp 中吗?

    如果一个节点想要在流的一侧执行自己的特定业务逻辑 如何实现 例如 如果一家公司想要调用内部公司 api 来验证传入的交易数据 它可以在流程中执行此操作吗 如果是这样 是否需要通用地编写流程 以便所有使用相同 Cordapp 和流程 的公司调
  • 读取文件内容并查询数据。蟒蛇3.5.1

    我正在尝试查询我保存在的销售记录data txt文件 每行以逗号分隔
  • 使用 R 将 Excel (.xlsx) 工作表打印/保存为 PDF

    我想打印一个Excel文件到一个pdf操作后的文件 对于操作 我使用了 xlsx包工作正常 有一个功能printSetup但我找不到启动打印的功能 有解决办法吗 library xlsx file lt test xlsx wb lt lo
  • 更改包名称

    我打算通过smali reverse 更改包名 当我打开 apktool yml 时 我看到了这个 强制包 ID 127 我尝试过更改它 但它崩溃了 我为什么要这样做 假设您的目标是重命名 apk 的包名称 则用于类的包名称是无关的 apk
  • THREE.js 导入的模型不应用面部纹理

    我正在尝试导入使用 THREEJS 导出器从搅拌机导出的模型 到目前为止 模型已加载并出现在我的场景中 并且正确应用了材质 汽车应为黄色 玻璃应为透明 但它并没有将我的纹理应用到以 tga 形式保存的汽车上 如果我不将纹理包含在模型所在的服
  • 为什么使用工厂而不是“新”?

    我正在看书其中指出 EMF 编程模型强烈鼓励但不要求 使用工厂来创建对象 而不是简单地使用 new 运算符创建 对象 为什么鼓励使用工厂new 您的答案不必是特定于 EMF 的 只要它与 Java 有关即可 您可以阅读 Effective
  • ng-repeat 没有 HTML 元素(这次真的没有任何)

    我想要得到类似的东西 Line 1 br Line 2 br Line 3 br Line 4 br Line 5 br 使用 ng repeat 各行之间不应有任何分隔符 除了 br 这是一个硬编码的简单指令 br HTML p p ap
  • 如何在 Webpack 中正确使用命名空间 Typescript

    我正在使用 webpack 开发一个新项目 这是我第一次尝试使用这个工具 自从 1 年以来 我一直使用 typescript 针对 angularJS 1 5 进行开发 并且从未遇到过与命名空间相关的任何问题 src App Core Ht
  • 在 Win 7 上安装 Python 2.7 32 位:没有注册表项?

    我已从 python org 下载了 Python 2 7 2 Windows x86 32 位 MSI 并将其安装在 64 位 Windows 7 系统上 一切正常 至少命令行解释器启动并运行 但安装过程不会创建任何PythonWindo
  • `fgetc()` 可能返回 `EOF` 的所有原因是什么?

    当然fgetc 回报EOF when 文件结尾 or an 输入错误 occurs 这就是全部吗 这是否意味着没有更多数据可用 FILE inf int ch while ch fgetc inf EOF if feof inf puts
  • Android中AIDL的实时示例和使用?

    我想知道aidl 的实时示例及其使用 我研究了有关此主题的android 开发人员博客 我无法在实时世界中实现这一点 谁能举个例子告诉我 AIDL用于以某种格式共享数据 primitive and parcelable 与其他应用程序 现实
  • 使用 Adob​​e Air 证书签署 Android Native apk

    我需要帮助使用为 Adob e Air 生成的现有 p12 证书来签署 Android 本机应用程序 几年前 应用程序在 Adob e Air 中完成 签名并发布到 Google Play 现在 当从 Adob e Air 迁移到 Andr
  • 通过 CSS 注入 HTML

    我需要基本上设置content来自 CSS 的 HTML 内容 我目前正在执行以下操作 myclass content img src 然而 我看到的不是图像 而是文字 img src hello png 如何使用 CSS 注入任意 HTM
  • 在数据库中存储条件逻辑表达式/规则

    如何使用 RDBMS 存储逻辑表达式 我标记对象并希望能够基于这些标记构建事实陈述 这些可能被视为虚拟标签 Tags new for sale used offer Rule second hand goods new or used an
  • 限制 TinyMCE 编辑器中的键盘快捷键

    试图找到在 TinyMCE 编辑器的 jQuery 版本中禁用单个键盘快捷键的位置 目前允许的快捷方式列表是 ctrl z Undo ctrl y Redo ctrl b Bold ctrl i Italic ctrl u Underlin
  • 如何将 Visual Studio 中的结构打包为包含 uint32_t 的 24 位?

    我正在尝试将现有应用程序从 32 位 ARM 微控制器移植到桌面平台 例如 Microsoft Windows GCC 在 ARM 上使用 我能够使用 32 位 MinGW 编译器在 Windows 上成功编译该应用程序 但是我使用 Mic
  • 如何让内部控件不覆盖主控件的事件?

    我有一个UserControl其中包含一些内部控件 像这样的东西 现在当我在我的项目中使用它时 我想要every如果单击 我的控件点会引发相同的单击事件 就像其他控件一样 但问题是 我的处理程序在另一个项目中 仅当我单击背景上的某个位置 而
  • AWS:找不到 iam 的实例元数据

    我正在尝试在我的 ec2 实例上设置 elasticsearch s3 快照 它失败并出现以下错误 nested NotSerializableExceptionWrapper sdk client exception The reques
  • 如何同时远程连接到多个 Glassfish 4+ 实例?

    我正在寻找一种从基于 Swing 的独立客户端 JDK7 SE 同时连接到 Glassfish 4 JDK7 EE 的多个实例的方法 我通过以下方式成功连接到单个实例 这就是初始上下文的构造 private void connect Str