Java EJB3客户端回调?
出于学习目的,由于我是EJB3新手,我将把棋盘游戏风险作为一个客户端服务器应用程序来实现,EJB3位于服务器端。其目的是让多个用户登录并一起玩游戏。目前,我正在考虑将JSF用于前端 存在多个实例,其中某个客户端“A”的操作需要导致通知另一个客户端“B”。例如,如果一个国家拥有B的攻击,B需要知道它,例如考虑掷骰子多少,如果他们想玩一张牌。 我有一个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
@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美分。谢谢EdH-这帮助我重新思考了我的问题;我在上面编辑了它。我缺少的关键是如何从会话bean“备份”到JSF托管bean…而不是实际调用会话bean的同一个托管bean,而是针对不同的用户。我希望我编辑的问题现在更加完整。