3

我们正在开发一个使用 RMI 和 JMS 连接到 Java 后端的富客户端(用 Flex 编写)。我正在考虑以 DDD 方式实现客户端,以便它具有用于域对象上的 CRUD 操作的存储库。

然而,问题是所有后端通信都是异步发生的,我无法强制客户端等待继续,直到它收到响应。这意味着,在低级别上,我可以调用远程对象上的方法并获得 AsyncToken 作为返回值。然后我可以监听 asynctoken 上的事件以查看调用是通过还是失败。然而,这打破了存储库背后的主要思想,向客户隐藏技术细节。

我猜可能有两种选择:

  1. 让存储库上的方法返回 asynctoken,这对我来说似乎是一个混乱的解决方案
  2. 让这些方法返回一个空集合(例如 findAll),当收到响应时该集合将被填充。

两者都有优点和缺点,我想从你们那里得到一些意见。

(更进一步,什么是好的缓存策略?根据情况,我不希望存储库在每次向它请求所有实体时都调用服务器。这将如何影响存储库上方法的签名。 )

4

3 回答 3

4

Flex 和 Flash 远程处理本质上是异步的,因此与这种范式作斗争会给您带来很多麻烦。我们的服务委托从每个方法返回 AsyncToken,我们从来没有遇到过问题。

如果您想确保应用程序在结果/故障返回之前不会呈现新视图或执行其他逻辑,您可以执行以下操作:

  1. 为自定义事件附加一个事件侦听器,该事件将调用您的“发布结果/故障代码”
  2. 进行异步调用
  3. 处理结果/故障
  4. 调度自定义事件以从 #1 触发您的侦听器

请记住,每次进行异步调用时,这都会导致大量烦人的样板代码。我会非常仔细地考虑您是否真的需要同步执行路径。

于 2008-11-29T07:01:56.990 回答
2

我建议返回一个 AsyncToken,因为返回一个空集合感觉不对。

在从缓存返回数据的情况下,返回一个 CompletedAsyncToken (: AsyncToken),只要订阅了 COMPLETE 事件(然后删除了处理程序),它就会自动触发带有数据的 COMPLETE 事件。

public class CompleteAsyncToken : AsyncToken
{
    public function CompleteAsyncToken(data : Object)
    {
        super(data);
    }

    public override addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) : void
    {
        super.addEventListener(type, listener, useCapture, priority, useWeakReference);

        if (type == Event.COMPLETE)
        {
            // Don't just execute listener as EventDispatcher is not that simple
            super.dispatchCompleteEvent();
            super.removeEventListener(type, listener);
        }
    }
于 2008-10-21T13:49:02.330 回答
1

一种策略是在存储库前面创建一个外观。您的客户端将对外观进行异步调用,而外观又对您的存储库进行同步调用。这将允许您的存储库以同步方式继续工作,而外观管理您调用的异步方面。

于 2008-10-21T11:53:53.543 回答