本人在企业开发中,碰到了问题:服务端用的是无状态的会话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中这样使用它来交换信息。
如题,大家的好的想法吗?谢谢。