gpt4 book ai didi

jakarta-ee - 从一台服务器到多台可配置服务器的 JNDI 查找

转载 作者:行者123 更新时间:2023-12-04 01:01:54 25 4
gpt4 key购买 nike

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

问题

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

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

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

本手册指出:

Note that this chapter deals with the case where the bean is deployed on the "Destination Server" but not on the "Client Server".

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 Controller 调用。

最佳答案

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

似乎不可能通过 EJB 在多个服务器之间建立可靠的连接,因此我们最终使用 JMS 进行服务器到服务器的通信。也许这对您来说也是一个选择。

关于jakarta-ee - 从一台服务器到多台可配置服务器的 JNDI 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22817414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com