27、从 .NET 和 C++ 访问 Coherence:功能与配置全解析

从 .NET 和 C++ 访问 Coherence:功能与配置全解析

从 .NET 访问 Coherence

从 .NET 访问 Coherence 时,有几个关键方面值得深入探讨,包括执行聚合器和条目处理器、监听缓存事件、使用连续查询缓存以及数据绑定等。

执行聚合器和条目处理器

Coherence for .NET 客户端库通过 Tangosol.Net.Cache.IInvocableCache 接口全面支持条目处理器执行和集群范围的聚合操作。这个接口与 Java 的 InvocableMap 接口类似,其定义如下:

public interface IInvocableCache : ICache
{
    Object Invoke(Object key, IEntryProcessor agent);
    IDictionary InvokeAll(ICollection keys, IEntryProcessor agent);
    IDictionary InvokeAll(IFilter filter, IEntryProcessor agent);
    Object Aggregate(ICollection keys, IEntryAggregator agent);
    Object Aggregate(IFilter filter, IEntryAggregator agent);
}

通过这个接口,你可以对单个条目或一组条目调用 IEntryProcessor ,只需指定键或过滤器来确定处理器的目标条目集。

AccountProcessor 类为例,它实现了基本的条目处理逻辑:

public abstract class AccountProcessor 
    : AbstractProcessor, IPortableObject
{
    protected AccountProcessor()
    {
    }
    protected AccountProcessor(Money amount, string description)
    {
        m_amount = amount;
        m_description = description;
    }
    public override object Process(IInvocableCacheEntry entry)
    {
        throw new NotSupportedException();
    }
    public void ReadExternal(IPofReader reader)
    {
        m_amount = (Money) reader.ReadObject(0);
        m_description = reader.ReadString(1);
    }
    public void WriteExternal(IPofWriter writer)
    {
        writer.WriteObject(0, m_amount);
        writer.WriteString(1, m_description);
    }
    protected Money m_amount;
    protected string m_description;
}

这个抽象类用于捕获状态(金额和交易描述),并将其传输到服务器,在服务器上它将被反序列化为一个完全实现的 Java 处理器并执行。基于此, DepositProcessor 类的实现就很简单了:

public class DepositProcessor : AccountProcessor
{
    public DepositProcessor()
    {}
    public DepositProcessor(Money amount, string description)
        : base(amount, description)
    {}
}
监听缓存事件

在桌面应用开发中,.NET 表现出色,因此 Coherence for .NET 客户端常用于从基于 Windows Forms 或 WPF 的桌面应用程序访问 Coherence 集群。其中一个强大的功能是能够注册并接收集群中数据变化的事件,从而实时更新应用程序的用户界面。

事件处理在 Java 和 .NET 中有显著差异。Java 应用通常使用经典的观察者模式,定义监听器接口,而 .NET 则将事件提升为一等语言构造,允许通过为每个事件注册委托来处理事件。

Coherence for .NET 库支持两种方法。你可以使用 Tangosol.Net.Cache.IObservableCache 接口以“Java 方式”注册接收事件:

public interface IObservableCache : ICache
{
    void AddCacheListener(ICacheListener listener);
    void RemoveCacheListener(ICacheListener listener);
    void AddCacheListener(ICacheListener listener, 
                          Object key, bool isLite);
    void RemoveCacheListener(ICacheListener listener, 
                             Object key);
    void AddCacheListener(ICacheListener listener, 
                          IFilter filter, bool isLite);
    void RemoveCacheListener(ICacheListener listener, 
                             IFilter filter);
}

ICacheListener 接口定义了三个方法,用于处理条目插入、更新和删除事件:

public interface ICacheListener
{
    void EntryInserted(CacheEventArgs evt);
    void EntryUpdated(CacheEventArgs evt);
    void EntryDeleted(CacheEventArgs evt);
}

同时,Coherence for .NET 库还提供了一些辅助类,允许你以“.NET 方式”处理事件。例如, Tangosol.Net.Cache.Support.DelegatingCacheListener 类:

public delegate void CacheEventHandler(object sender, 
                                       CacheEventArgs args);
public class DelegatingCacheListener : ICacheListener
{
    public virtual event CacheEventHandler EntryInserted;
    public virtual event CacheEventHandler EntryUpdated;
    public virtual event CacheEventHandler EntryDeleted;
    ...
}

使用示例如下:

IObservableCache cache = CacheFactory.GetCache("accounts");
DelegatingCacheListener listener = new DelegatingCacheListener();
listener.EntryUpdated += AccountUpdated;
cache.AddCacheListener(listener);

private static void AccountUpdated(object sender, 
                                   CacheEventArgs args)
{
    // handle event...
}

在 Windows Forms 应用程序中,缓存事件会在后台线程上引发,如果需要在事件处理程序中执行与 UI 相关的操作,则需要将事件封送到 UI 线程。Coherence 提供了 Tangosol.Net.Cache.Support.WindowsFormsCacheListener 类来解决这个问题:

WindowsFormsCacheListener listener = 
    new WindowsFormsCacheListener(this);
listener.EntryUpdated += this.AccountUpdated;
cache.AddCacheListener(listener);

private void AccountUpdated(object sender, CacheEventArgs args)
{
    // refresh account details on the UI
}
连续查询缓存

连续查询缓存(Continuous Query Cache,CqC)在各种应用程序中都非常有用,它允许将分区缓存中的部分或全部数据引入客户端进程,并确保本地缓存的数据始终是最新的。在桌面应用程序中,CqC 尤其有趣,因为它可以轻松创建高度动态的用户界面,随着后端数据的变化自动更新。

创建连续查询缓存的方法很简单,只需创建 Tangosol.Net.Cache.ContinuousQueryCache 类的实例,并传入目标缓存和过滤器:

INamedCache accounts = CacheFactory.GetCache("accounts");
ContinuousQueryCache view = new ContinuousQueryCache(accounts, 
    AlwaysFilter.Instance, listener);
与 Windows Presentation Foundation (WPF) 进行数据绑定

在多平台示例应用程序的 .NET 组件 BranchTerminal 中,需要向银行员工显示实时账户和交易信息。为此,我们创建了 Accounts 类:

public class Accounts : 
    ObservableCollection<Account>, IDisposable
{
    private readonly ContinuousQueryCache m_view;
    public Accounts(DispatcherObject control)
    {
        WpfCacheListener listener =  new WpfCacheListener(control);
        listener.EntryDeleted += OnDelete;
        listener.EntryInserted += OnAdd;
        listener.EntryUpdated += OnUpdate;
        INamedCache accounts = CacheFactory.GetCache("accounts");
        m_view = new ContinuousQueryCache(accounts,                       
            AlwaysFilter.Instance, listener);
    }
    public void OnAdd(object sender, CacheEventArgs evt)
    {
        Add((Account) evt.NewValue);
    }
    public void OnUpdate(object sender, CacheEventArgs evt)
    {
        int index = IndexOf((Account) evt.OldValue);
        SetItem(index, (Account) evt.NewValue);
    }
    public void OnDelete(object sender, CacheEventArgs evt)
    {
        Remove((Account) evt.OldValue);
    }
    public void Dispose()
    {
        m_view.Release();
    }
}

这个类扩展了 ObservableCollection ,并使用 CqC 事件来保持其内容与 CqC 同步。

接下来,需要将应用程序主屏幕上的 ListView 控件绑定到 Accounts 集合。首先,在 AccountsWindow 类中公开 Accounts 属性:

public partial class AccountsWindow
{
    private readonly Accounts m_accounts;
    private readonly Transactions m_transactions;
    public AccountsWindow()
    {
        try
        {
            m_accounts = new Accounts(this);
            m_transactions = new Transactions(this);
            InitializeComponent();
        }
        catch (Exception ex)
        {
            ...
        }
    }
    public Accounts Accounts
    {
        get { return m_accounts; }
    }
    ...
}

然后,在 AccountsWindow 的 XAML 文件中定义必要的数据绑定:

<Window
    x:Class="Seovic.Samples.Bank.UI.AccountsWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cm="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    Title="Accounts" Height="600" Width="800" WindowState="Maximized" 
    Unloaded="Window_Unloaded">
    <Window.Resources>
        <CollectionViewSource x:Key="AccountsViewSource" 
                              Source="{Binding Accounts}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="Customer.Name"/>     
            </CollectionViewSource.GroupDescriptions>
            <CollectionViewSource.SortDescriptions>
                <cm:SortDescription PropertyName="Customer.Name" 
                                    Direction="Ascending" />
                <cm:SortDescription PropertyName="Description" 
                                    Direction="Ascending" />
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>
    </Window.Resources>
    ...
    <ListView 
        ItemsSource="{Binding Source={StaticResource AccountsViewSource}}"
        SelectionChanged="AccountList_SelectionChanged" 
        Grid.Row="1" Grid.Column="0"  Name="AccountList"   
        Background="White">
        ...
    </ListView>
</Window>

通过这些步骤,我们可以确保 ListView 中的项目正确分组和排序,并随着底层 Accounts 集合的变化自动刷新。

从 C++ 访问 Coherence

Coherence C++ 是 Coherence 产品系列的最新成员,作为纯原生库发布,支持多种平台,包括 Windows、Linux、Solaris 和 Apple OS X 的 32 位和 64 位版本。由于 Coherence C++ 是 Coherence*Extend 客户端,其可用功能集与 Coherence Java 和 .NET Extend 客户端提供的功能几乎相同。

配置 Coherence C++

Coherence C++ 支持与 Java 和 .NET 版本相同的配置机制,C++ 变体是基于 DTD 的 XML 文件,是 Java 版本的子集。因此,大部分配置选项可以重用为 Java Extend 客户端构建的缓存和操作配置文件。

不过,也有一些值得注意的差异:
- 系统属性覆盖 :Java 客户端的系统属性配置覆盖功能在 C++ 客户端中以环境变量的形式提供。在某些 Unix shell 中,可能不支持以 . 分隔的环境变量,因此可以使用驼峰命名法,例如 tangosol.coherence.override TangosolCoherenceOverride 被认为是等效的。
- 高级配置 :在通过配置提供自定义类的高级配置中,需要使用 C++ 命名约定,即使用 :: 而不是 . 作为类名分隔符。
- POF 配置 :C++ 的 POF 配置是编程式的,而不是声明式的。这意味着需要在代码中包含 POF 类型 ID 到类的注册,这可以通过在数据对象的 .cpp 文件中添加一行简单的代码来完成。

如果缓存和可选的操作配置文件包含在应用程序的启动目录中,它们将自动加载,默认文件名继承自 Java 客户端,即 coherence-cache-config.xml tangosol-coherence-override.xml 。如果使用了其他位置或文件名,则需要通过编程方式告诉 Coherence C++ 在哪里查找这些文件:

CacheFactory::configure(
    CacheFactory::loadXmlFile("c:/config/MyCacheConfig.xml"));

或者,你也可以使用环境变量来覆盖默认名称和位置,避免以编程方式指定。相关环境变量名继承自 Java, tangosol.coherence.cacheconfig 指定缓存配置文件的路径, tangosol.coherence.override 指定操作配置文件的路径。

综上所述,无论是从 .NET 还是 C++ 访问 Coherence,都有各自的特点和优势。通过合理配置和使用相关功能,开发者可以充分利用 Coherence 的强大功能,为应用程序带来更好的性能和用户体验。在实际开发中,需要根据具体需求和场景选择合适的访问方式和配置方法。

从 .NET 和 C++ 访问 Coherence:功能与配置全解析

总结与对比

为了更清晰地了解从 .NET 和 C++ 访问 Coherence 的特点,我们可以通过以下表格进行对比:
| 访问方式 | 适用场景 | 配置特点 | 事件处理 | 数据绑定 |
| — | — | — | — | — |
| .NET | 基于 Windows Forms 或 WPF 的桌面应用程序 | 部分配置可重用 Java 配置,有多种事件处理方式 | 支持 Java 观察者模式和 .NET 委托方式 | 可与 Windows Forms 和 WPF 进行数据绑定 |
| C++ | 跨平台应用程序 | 配置是 Java 版本的子集,有特殊配置差异如系统属性用环境变量、POF 配置编程式 | - | - |

从这个表格可以看出,.NET 更适合桌面应用开发,尤其是需要实时更新 UI 的场景,而 C++ 则在跨平台应用中具有优势。

操作步骤总结

下面我们将从 .NET 和 C++ 访问 Coherence 的操作步骤进行总结:

.NET 操作步骤
  1. 执行聚合器和条目处理器
    • 实现 IInvocableCache 接口相关方法,对单个或多个条目调用 IEntryProcessor
    • 定义 AccountProcessor 及其子类,如 DepositProcessor ,用于捕获状态并传输到服务器。
  2. 监听缓存事件
    • 使用 IObservableCache 接口以“Java 方式”注册事件。
    • 使用 DelegatingCacheListener 类以“.NET 方式”处理事件。
    • 在 Windows Forms 应用中,使用 WindowsFormsCacheListener 类将事件封送到 UI 线程。
  3. 使用连续查询缓存
    • 创建 ContinuousQueryCache 类的实例,传入目标缓存和过滤器。
  4. 与 WPF 进行数据绑定
    • 创建 Accounts 类,扩展 ObservableCollection 并使用 CqC 事件同步内容。
    • AccountsWindow 类中公开 Accounts 属性。
    • 在 XAML 文件中定义数据绑定,确保数据分组、排序和自动刷新。
C++ 操作步骤
  1. 配置 Coherence C++
    • 大部分配置可重用 Java 配置文件。
    • 处理系统属性覆盖、高级配置和 POF 配置的差异。
    • 若配置文件不在默认位置,通过编程方式或环境变量指定路径。
流程图展示

下面是从 .NET 访问 Coherence 的主要操作流程 mermaid 流程图:

graph TD;
    A[开始] --> B[执行聚合器和条目处理器];
    B --> C[监听缓存事件];
    C --> D[使用连续查询缓存];
    D --> E[与 WPF 进行数据绑定];
    E --> F[结束];

从 C++ 访问 Coherence 的主要操作流程 mermaid 流程图如下:

graph TD;
    A[开始] --> B[配置 Coherence C++];
    B --> C[处理配置差异];
    C --> D[指定配置文件路径];
    D --> E[结束];
实际应用效果

当我们完成上述配置和操作后,在实际应用中可以看到显著的效果。在 .NET 桌面应用中,通过监听缓存事件和使用连续查询缓存,能够实时更新用户界面,为用户提供最新的数据展示。例如,在银行应用中,账户余额和交易列表会随着后端数据的变化而自动刷新。

在 C++ 跨平台应用中,通过合理配置 Coherence C++,可以充分利用 Coherence 的分布式缓存功能,提高应用程序的性能和可扩展性。

未来展望

随着技术的不断发展,从 .NET 和 C++ 访问 Coherence 的功能可能会进一步完善和扩展。例如,可能会有更简化的配置方式、更高效的事件处理机制以及更强大的数据绑定功能。开发者可以持续关注相关技术的发展,以便在未来的项目中更好地利用 Coherence 的优势。

总之,掌握从 .NET 和 C++ 访问 Coherence 的方法,能够为开发者提供更多的选择和可能性,帮助他们构建出更强大、更高效的应用程序。无论是桌面应用还是跨平台应用,Coherence 都能为其带来显著的性能提升和用户体验改善。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值