JNDI从一个服务器查找到许多可配置的服务器

时间:2014-04-02 16:21:02

标签: java-ee jboss ejb jboss7.x ear

我们在具有不同IP的不同机器上有几个JBoss服务器(不是集群,属于不同客户的单个独立JBoss 7.1.1实例)。所有系统都部署了完全相同的EAR。我们尝试将一个名为 Group 的POJO从一个系统发送到另一个系统。

问题

我们尝试了一切,但无法获取调用的远程方法。建立连接但未使用(在某些情况下使用本地bean)。我们可以做些什么来使沟通发挥作用?

我们试图遵循这些手册(到目前为止没有任何运气):

来自远程服务器实例的EJB调用

本手册指出:

  

请注意,本章介绍了部署bean的情况   在“目标服务器”上,但“客户端服务器”上的不是

由于没有目标服务器或客户端服务器,因此bean部署在两台服务器上。两个服务器可以是客户端或目的地,具体取决于方案,例如客户A可能希望今天向客户B发送,而客户C可能希望明天将发送给客户A.后天,客户A可能希望将 Group 发送给客户C.

来源:https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+server+instance

使用JNDI从远程客户端调用EJB

这也没用。本手册使用的是无法在运行时更改的.properties文件,这使得此方法无法使用,即使它可以工作(它没有)。

来源:https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+client+using+JNDI

通过JNDI进行远程EJB调用 - EJB客户端API或远程命名项目

此方法将“jboss.naming.client.ejb.context”设置为true。这会导致SecurityException,因为调用了EJBClientContext.setSelector。

来源:https://docs.jboss.org/author/display/AS71/Remote+EJB+invocations+via+JNDI+-+EJB+client+API+or+remote-naming+project

项目结构

这是我们的项目结构:

project/
    ear/
        pom.xml
    war/
        pom.xml
        src/main/java/com/acme/ejb/
            DefaultGroupImportBean.java
    ejb/
        pom.xml
        src/main/java/com/acme/ejb/
            DefaultGroupTransferBean.java
    ejb-api/
        pom.xml
        src/main/java/com/acme/ejb
            GroupImportBean.java
            GroupTransferBean.java
            RemoteEjbClient.java

这是进行查找的类:

public class RemoteEjbClient {

    private static final String INITIAL_CONTEXT_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory";

    public GroupTransferBean lookupGroupTransferBean(NamingContextConfiguration namingContextConfiguration)
        throws NamingException {

        Context context = createInitialContext(namingContextConfiguration);
        return (GroupTransferBean) context.lookup(namingContextConfiguration.getLookupName());
    }

    private Context createInitialContext(NamingContextConfiguration namingContextConfiguration) throws NamingException {
        Properties jndiProperties = new Properties();
        jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
        jndiProperties.put(Context.PROVIDER_URL, namingContextConfiguration.getProviderUrl());
        jndiProperties.put(Context.SECURITY_PRINCIPAL, namingContextConfiguration.getPrincipal());
        jndiProperties.put(Context.SECURITY_CREDENTIALS, namingContextConfiguration.getCredentials());

        return new InitialContext(jndiProperties);
    }
}

NamingContextConfiguration 是描述另一个系统的POJO。我们在数据库中存储了-_NamingContextConfiguration_s(它们必须在运行时可配置!)。已使用 add-user.sh 应用程序用户)添加了主体。

GroupTransferBean.java:

public interface GroupTransferBean {

    void pushGroup(Group group);

    void pushResources(String url, List<String> resources);
}

GroupImportBean.java:

public interface GroupImportBean {

    public void importGroup(Group group);

    public void importResources(String url, List<String> resources);
}

DefaultGroupTransferBean.java:

@Stateless(mappedName = "GroupTransferBean")
@Remote(GroupTransferBean.class)
public class DefaultGroupTransferBean implements GroupTransferBean {

    @EJB
    private GroupImportBean groupImportBean;

    @Override
    public void pushGroup(Group group) {
        groupImportBean.importGroup(group);
    }

    @Override
    public void pushResources(String url, List<String> resources) {
        groupImportBean.importResources(url, resources);
    }
}

DefaultGroupImportBean.java:

@Stateless
@Remote(GroupImportBean.class)
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class DefaultGroupImportBean implements GroupImportBean {

    @Autowired
    private GroupRepository groupRepository;

    @Override
    public void importGroup(Group group) {
        groupRepository.save(group);
    }

    @Override
    public void importResources(String url, List<String> resources) {
        // Do some magic
    }
}

RemoteEjbClient由Spring控制器调用。

1 个答案:

答案 0 :(得分:0)

几乎与此处描述的问题相同:Lookup of same EJB on multiple servers

似乎不可能通过EJB获得多个服务器之间的依赖连接,因此我们最终使用JMS进行服务器到服务器的通信。也许这也是你的选择。