从 .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 操作步骤
- 执行聚合器和条目处理器
- 实现
IInvocableCache接口相关方法,对单个或多个条目调用IEntryProcessor。 - 定义
AccountProcessor及其子类,如DepositProcessor,用于捕获状态并传输到服务器。
- 实现
- 监听缓存事件
- 使用
IObservableCache接口以“Java 方式”注册事件。 - 使用
DelegatingCacheListener类以“.NET 方式”处理事件。 - 在 Windows Forms 应用中,使用
WindowsFormsCacheListener类将事件封送到 UI 线程。
- 使用
- 使用连续查询缓存
- 创建
ContinuousQueryCache类的实例,传入目标缓存和过滤器。
- 创建
- 与 WPF 进行数据绑定
- 创建
Accounts类,扩展ObservableCollection并使用 CqC 事件同步内容。 - 在
AccountsWindow类中公开Accounts属性。 - 在 XAML 文件中定义数据绑定,确保数据分组、排序和自动刷新。
- 创建
C++ 操作步骤
- 配置 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 都能为其带来显著的性能提升和用户体验改善。
超级会员免费看

1282

被折叠的 条评论
为什么被折叠?



