首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态远程EJB调用

动态远程EJB调用
EN

Stack Overflow用户
提问于 2017-04-27 21:18:22
回答 1查看 575关注 0票数 0

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

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

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

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

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

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

远程EJB接口:

代码语言:javascript
运行
复制
import javax.ejb.Remote;

@Remote
public interface EJBInterface {

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

远程EJB:

代码语言:javascript
运行
复制
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。我应该使用接口还是指示类来实现?此外,我假设我需要向每个热部署应用程序添加一个公共EJB,它为我提供了我想要调用的EJB的信息,以便我可以在客户机/管理端创建一个类或接口。

那么,如果我应该在客户机/管理端或类上创建一个接口,并调用没有接口视图的EJB,那么是否有人有一个改进呢?我需要另一个类提供来自远程EJB?的信息。

谢谢忠告。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-03 16:32:00

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

EJB模块代码(命令、CommandType、CommandMgr、HelloBean)

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

代码语言:javascript
运行
复制
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 enum描述的可用命令类型:

代码语言:javascript
运行
复制
public enum CommandType { UNKNOWN, HELLO }

CommandMgr是一个远程业务接口,用于接收命令消息:

代码语言:javascript
运行
复制
package x;

import javax.ejb.Remote;

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

CommandMgrImpl类实现业务接口:

代码语言:javascript
运行
复制
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是通过远程接口间接访问的会话bean之一:

代码语言:javascript
运行
复制
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注入的后台bean):

hellopage.xhtml:

代码语言:javascript
运行
复制
<?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是一个视图作用域托管bean:

代码语言:javascript
运行
复制
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;
  }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43668073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档