Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EJB3客户端回调?_Java_Callback_Ejb_Ejb 3.0 - Fatal编程技术网

Java EJB3客户端回调?

Java EJB3客户端回调?,java,callback,ejb,ejb-3.0,Java,Callback,Ejb,Ejb 3.0,出于学习目的,由于我是EJB3新手,我将把棋盘游戏风险作为一个客户端服务器应用程序来实现,EJB3位于服务器端。其目的是让多个用户登录并一起玩游戏。目前,我正在考虑将JSF用于前端 存在多个实例,其中某个客户端“A”的操作需要导致通知另一个客户端“B”。例如,如果一个国家拥有B的攻击,B需要知道它,例如考虑掷骰子多少,如果他们想玩一张牌。 我有一个@Stateless会话bean,通过@WebService或@Remote接口公开,该bean被称为攻击()和防御()。如果玩家A调用了attack

出于学习目的,由于我是EJB3新手,我将把棋盘游戏风险作为一个客户端服务器应用程序来实现,EJB3位于服务器端。其目的是让多个用户登录并一起玩游戏。目前,我正在考虑将JSF用于前端

存在多个实例,其中某个客户端“A”的操作需要导致通知另一个客户端“B”。例如,如果一个国家拥有B的攻击,B需要知道它,例如考虑掷骰子多少,如果他们想玩一张牌。 我有一个
@Stateless
会话bean,通过
@WebService
@Remote
接口公开,该bean被称为
攻击()
防御()
。如果玩家A调用了
attack()
,我需要通知被攻击的玩家B,以便B可以决定调用
defend()
的参数。具体来说,这相当于A调用PlayBean的托管bean,然后PlayBean调用B的托管bean。如何执行会话bean到托管bean回调?(一旦我能够“进入”托管bean,我就可以从那里看到JSF的服务器推送特性,直接向用户展示)

我的直觉是让页面bean提供回调对象作为会话bean的参数。。。但是EJB3是这样工作的吗

@Stateless
public class PlayBean implements Play {
    @Override
    public void attack(OccupiedTerritory from, OccupiedTerritory to, int battalions, Set<Leader> leader) {
    int attackDice = battalions;
    Die die = new Die(6); // TODO read number of sides from cfg
    Iterator<Leader> leaderIt = leader.iterator();
    int[] roll = new int[attackDice];
    for (int i = 0; i < attackDice; i++) {
        int bonus = leaderIt.hasNext() ? leaderIt.next().getAttackBonus() : 0;
        roll[i] = die.roll(bonus);
    }
    Arrays.sort(roll);
    Player victim = to.getOccupier(); // ...but how do I nudge this player (NOT the player that invoked this method) to act, i.e. to choose how many defence dice to use? I need to get a reference to "victim"'s JSF managed bean.
}
@无状态
公共类PlayBean实现Play{
@凌驾
公共无效攻击(占领地从,占领地到,内部营,集合指挥官){
int attackDice=营;
模具=新模具(6);//TODO从cfg读取边数
迭代器leaderIt=leader.Iterator();
int[]掷骰=新int[攻击];
for(int i=0;i
我认为这在很大程度上取决于您没有提供的信息

例如,如果客户机是厚客户机(Java或其他),您可以在服务器中使用JMS设置消息传递方法。连接时,客户端只需设置一个侦听事件的消息传递客户端。服务器可以使用消息启动事件。如果客户端中使用Java,JMS也可以在客户端中使用。但使用消息传递会导致客户端和服务器组件无法构建如果需要,使用不同的语言

如果客户机是一个瘦的web应用程序,那么您实际上是在看web框架提供了什么(而且EJB更少……尽管JMS仍然可以在服务器中用于触发事件).JSF框架(如ICEfaces和Primefaces)支持服务器推送,这允许服务器将更新推送到客户端。我认为ZK也支持这一点,因此它不仅限于JSF


不管怎样,我认为这个问题的答案并不仅仅是由EJB来描述的。希望这能有所帮助。

可能是您应该重新思考您对成熟的EAR的看法以及不同组件的作用。如果您使用EJB,您应该将应用程序视为一个事务系统。很多问题都可以转化为事务问题如果你愿意的话

在您的例子中,您应该将JSF托管bean视为控制器扩展或页面的支持bean。除了向EJB显示信息或隧道操作外,其中没有任何逻辑或状态。这意味着不需要从EJB调用它们

那么,您的数据模型在哪里?(即,谁攻击谁。)对于本例,让一个单例EJB保存此数据就足够了。然后,您可以使用PlayBean修改单例数据模型Bean的数据

现在是时候为你的最后一个问题找到解决方案了。如何将数据的变化通知玩家。(这就是“你被攻击了”的事情)。如果你使用任何html前端(如JSF),问题总是一样的。没有像真正推送网页这样的事情。我看到两种选择:

  • 轮询(如元刷新)或用户手动刷新

  • 使用类似彗星2的东西

  • 所以您的问题不是关于EJB或JAF托管bean,而是关于HTML前端推送通知;-)


    只有我的2美分。

    谢谢EdH-这帮助我重新思考了我的问题;我在上面编辑了它。我缺少的关键是如何从会话bean“备份”到JSF托管bean…而不是实际调用会话bean的同一个托管bean,而是针对不同的用户。我希望我编辑的问题现在更加完整。