使用远程独立客户端

时间:2017-04-25 14:32:25

标签: java java-ee jboss ejb-3.1 wildfly-10

虽然我之前使用过EJB,但我想再次向自己保证,我了解它是如何运作的。

因此,我创建了一个简单会话Bean EJB(3.1),并将其打包为.ear(也包含客户端jar)。以下是片段:

会话Bean实施:

package com.example;
import javax.ejb.Stateless;

    @Stateless
    public class FirstSessionEJB implements FirstSessionEJBRemote {

    public FirstSessionEJB() {

    }

    @Override
    public String print() {

        return "Hello";
    }
}

远程接口:

package com.example;

import javax.ejb.Remote;

@Remote
public interface FirstSessionEJBRemote {
    public String print();
}

我将此EJB部署为.ear,并在Wildfly 10.x中成功部署。

现在,我想使用独立的Java客户端访问它,在单独的JVM中运行。

这是客户端代码(可能没有完成,因为我不清楚如何主要由于JNDI而调用)。

package com.example.main;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.example.FirstSessionEJBRemote;

public class Main {

    public static void main(String[] args) throws NamingException {

        String GLOBAL_JNDI_NAME="java:global/FirstEJBProjEAR/FirstEJBProj/FirstSessionEJB!com.example.FirstSessionEJBRemote";

        Hashtable<String,String> jndiProperties = new Hashtable<>();
        jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");

        InitialContext ic = new InitialContext(jndiProperties);

        FirstSessionEJBRemote ejbRemote = null;
        ejbRemote = (FirstSessionEJBRemote)ic.lookup(GLOBAL_JNDI_NAME);
        ejbRemote.print();
    }
}

我提到了this关于如何进行JNDI查找的链接(以及所使用的所有参数,但它不起作用。)

在链接中提到它具有Wildfly特定的jar,它在没有JNDI查找的情况下工作。

任何人都可以帮助我理解:

1)我需要为JNDI设置的所有属性是什么?

2)客户端应用程序中是否需要存在任何特定的jar?

我不想使用任何特定的Wildfly jar,也就是说,我想使用传统的JNDI查找,所以有人可以指导我吗?

为了写一个简单的“你好世界”而奋斗是非常令人沮丧的。一种EJB。我提到一些书很好,但他们所提供的只是&#34;查找&#34;代码没有实际告诉JNDI和任何要包含的jar都需要包含所有属性。

1 个答案:

答案 0 :(得分:2)

正如您链接到状态的文章虽然有点隐藏在那一堆文本中,但您确实需要在Wildfly服务器安装中找到的jboss-client.jar(bin / client / jboss-client.jar);它需要在客户端的运行时类路径上。它包含从代码中引用的 org.jboss.ejb.client.naming 包开始。

jar包含了额外的魔力,让客户能够使用Wildfly服务器设置和维护EJB远程调用,只需使用JNDI就不会削减它。并且没有一个jar可以统治它们,每个容器(Wildfly,Glassfish,Weblogic等)都有自己的客户端库实现。

请注意,从客户端应用程序调用EJB是非常古老的学校(请阅读:您不希望这样做)。 EJB技术的更现实和现代的观点是在企业容器本身中使用它,例如来自Web应用程序/战争 - 例如作为RESTful服务的一部分。您可能甚至不需要额外的EAR文件层,您可以将所有内容整齐地打包到一个war应用程序中。

在这种情况下,如果您有客户端应用程序,该客户端可以与RESTful服务进行通信 - 这是一种更简单,跨服务器,跨平台的通信接口。