gpt4 book ai didi

java - 动态远程EJB调用

转载 作者:行者123 更新时间:2023-12-02 13:19:00 25 4
gpt4 key购买 nike

我找了很长时间,但实际上还没有找到适合我的情况的正确答案。

一般我想在不知道远程EJB所有方法的情况下调用它。据我所知,我需要使用反射来完成它。

问题是我是否应该在客户端使用接口(interface)?通常我使用 EJB 调用的接口(interface),但我想我需要使用字节码操作在运行时创建动态接口(interface)???

最后的想法是在运行时将新应用程序部署到 jboss 服务器(hotdeploy),并通过管理服务器从新部署的应用程序调用 EJB(来自 EJB 的主应用程序)。因此我可以在运行时添加/删除/更新逻辑/EJB。

但远程 EJB 并非每次都相同(取决于它应执行的任务)。因此,我需要为每个要调用的新部署的应用程序/ejb 动态创建一个接口(interface)或类。客户端/管理员只知道 JNDI 名称。

假设这是我的界面和来自热部署应用程序的 ejb 代码。请考虑这只是 n 个 EJB 中的一个。

远程 EJB 接口(interface):

import javax.ejb.Remote;

@Remote
public interface EJBInterface {

public void www();
public void store();
}

远程 EJB:

import javax.ejb.Stateless;

import com.xx.yy.EJBInterface;

@Stateless
public class EJBStuff implements EJBInterface{

@Override
public void www() {
//Do some stuff
}

@Override
public void store() {
//Do some stuff
}
}

在客户端/管理端,我想调用 EJB。我应该使用接口(interface)还是直接使用类来实现???此外,我假设我需要向每个热部署应用程序添加一个通用 EJB,它为我提供了我想要调用的 EJB 的信息,以便我可以在客户端/管理端创建一个类或接口(interface)。

那么有人建议我是否应该在客户端/管理端或类上创建一个接口(interface)并在没有接口(interface) View 的情况下调用 EJB ???我需要另一个类为我提供来自远程 EJB 的信息???

谢谢指教。

最佳答案

您的问题的解决方案是“命令设计模式”。我的示例是一个 Web 客户端,以避免 JNDI 查找造成的不便(无论如何,这不是问题的一部分)

EJB 模块代码(Command、CommandType、CommandMgr、HelloBean)

Command 类用于以抽象方式调用 SLSB 的参数化方法:

package x;

import java.util.HashMap;
import java.util.Map;

public class Command
{
private int type;
private final Map<String,Object> params = new HashMap<>();

public Command( int type_ ) { type = type_; }
public int getType() { return type; }
public Map<String,Object> getParams() { return params; }
public Object getParamByKey( String key_ ) { return params.get( key_ ); }
}

CommandType 枚举描述的可用命令类型:

public enum CommandType { UNKNOWN, HELLO }

CommandMgr是接收Command消息的远程业务接口(interface):

package x;

import javax.ejb.Remote;

@Remote
public interface CommandMgr
{
public Object send( Command command_ );
}

CommandMgrImpl 类实现业务接口(interface):

package x;

import java.security.InvalidParameterException;
import javax.ejb.Stateless;
import javax.inject.Inject;

@Stateless( name = "commandMgr" )
public class CommandMgrImp implements CommandMgr
{

@Inject
private HelloBean helloBean;

@Override
public Object send( Command command_ )
{
if ( command_ != null )
switch ( command_.getType() )
{
case 1:
return helloBean.sayHello( (String) command_.getParamByKey( "name" ) );
default:
return null;
}
else
throw new InvalidParameterException( "CommandMgrImp.send() : command_=null");
}

}

HelloBean 是通过远程接口(interface)间接访问的 session bean 之一:

package x;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;

@Named
@ApplicationScoped
public class HelloBean
{
public String sayHello( String name_ )
{
return "Hello " + name_ + "!";
}
}

Web 客户端代码是一个常见的 JSF Web 模块(一个页面和一个 EJB 注入(inject)的支持 bean):

hellopage.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form>
<h:panelGrid columns="3">
Enter your name:<h:inputText id="name" value="#{commandClient.name}"/>
<h:commandButton value="Submit">
<f:ajax listener="#{commandClient.updateMessage}" execute="@form" render="msg"/>
</h:commandButton>
</h:panelGrid>
<h:messages id="msg"/>
</h:form>
</h:body>
</html>

CommandClient 是一个 View 范围的托管 bean:

package x;

import java.io.Serializable;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
public class CommandClient implements Serializable
{
private String name;

@EJB
private CommandMgr commandMgr;

public String getName()
{
return name;
}

public void setName( String name_ )
{
name = name_;
}

public void updateMessage( AjaxBehaviorEvent event_ )
{
Command cmd = createHelloCommand();
FacesMessage msg = new FacesMessage( (String) commandMgr.send( cmd ) );
FacesContext.getCurrentInstance().addMessage( "name", msg );
}

protected Command createHelloCommand()
{
Command cmd = new Command( CommandType.HELLO.ordinal() );
cmd.getParams().put( "name", name );
return cmd;
}

}

关于java - 动态远程EJB调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43668073/

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