如何在EJB/RMI中客户端与服务端并发计算,同时保持交互?

本人在企业开发中,碰到了问题:服务端用的是无状态的会话bean,客户端是GUI环境,两端都可以有多个任务并发进行,但是两端中需要一些任务在一次远程调用中保持交互,可行吗?

例如:当用户在客户端 启用三个任务,就会通过一次远程调用服务端的bean的远程方法,服务端远程方法会启用三个线程来执行这三个任务;当某个线程在执行过程中发现了某个错误,需要反馈给客户端让用户选择:取消或继续。如果是取消,则当前线程终止,如果是继续,则当前线程继续查找其它错误(找到时,又反馈给客户端选择.......)。这意味着在后台某个线程执行时,会保存当前运行状态并暂停,传递错误信息给客户端,等侯客户端的选择;客户端会有一个专门的线程监听服务端的错误信息,如果收到则交给EDT显示一个对话框供用户选择,用户选好后,EDT把结果传递给服务端正在等侯的线程.......

现在的难点是:

1、服务端的线程能否在计算过程(此过程会与数据库交互)中暂停?如何把消息传递客户端(通过RMI或EJB的某种方式吗)?

2、客户端如何在保持一个监听任务结果的同时,用另一个守侯线程专门等侯可能会来自服务端的错误信息?如何发出信息?

我的示意代码为:

一、客户端的 MyUI.java,在main线程中的部分代码

import java.util.concurrent.*;

// Java 5 中的Exchanger

private final Exchanger exchanger = new .......;

// 保存服务端可能的错误集合,这个应该用适当的同步,但为了显示主题,暂忽略

private List<boolean> hasErrors = .......;

// EDT 启动一个等侯线程监听exchanger

WaiterThread waiter = new Thread(new Runnable() {

public void run() {

// waiter会一直等到有另一个线程与它交换值

boolean hasError = exchanger.exchange(userChoice);

hasErrors.add(hasError);

});

// 取得远程接口

MyRemotInterface ri = MyRemoteInterfaceFactory.getRemoteInstance();

// 调用远程接口的方法,会启动三个线程,正常的结果会返回来

  Map results = ri.workOnTasks(3,waiter);

waiter.start();

// EDT做完其它事,会停下来响应用户界面......

while(true){

  // 不断查询hasErrors,如果有新的错误,则弹出对话框

}

//.......

二、服务服务端 在MyBean.java中

publice Map workOnTasks(int number,Exchanger ex) throw RemoteExcepion{

  // 启动三个线程招行任务,每一个有找到错误时,通过ex发回客户端,并等待从客户端返回的结果

// .......

}

 

问题是,RMI中的方法调用不是传引用的,Exchanger会在两端的JVM中分别实例化为不同的对象,所以不能通过Exchanger在同一个JVM中这样使用它来交换信息。

如题,大家的好的想法吗?谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值