我在一个解决方案中使用cassandrasharp 3.1.4和cassandra 2.0.6有4个依赖的工作窗口服务。
在第一个上,我使用;初始化clusterManager; (此代码仅用于第一项服务,当我尝试在每项服务中配置clusterManager时,这些服务无法启动。)
CassandraSharp.Config.XmlConfigurator.Configure();
这是我的app.config;
<configSections>
<section name="CassandraSharp" type="CassandraSharp.SectionHandler, CassandraSharp.Interfaces" />
</configSections>
<CassandraSharp>
<Cluster name="main">
<Endpoints>
<Server>kml-vm-cas-001.cloudapp.net</Server>
</Endpoints>
</Cluster>
</CassandraSharp>
每个服务的和OnStop;
ClusterManager.Shutdown();
流程很简单,这些服务中的每一个都从不同的实时流中读取字符串,反序列化并推送到cassandra。
string query = null;
ICqlCommand pocoCommand = null;
Task task = null;
using (ICluster iCluster = ClusterManager.GetCluster("main"))
{
query = string.Format("insert into Tvr.Zools (Part, Name, Ticks) values ('zools', '{0}', {1}) using ttl 86400;",
this.zools[i].Name,
dateTime.Ticks,
);
pocoCommand = iCluster.CreatePocoCommand();
task = pocoCommand.Execute(query).AsFuture();
task.Wait();
query = string.Format("insert into Tvr.Temps (Part, Name, Ticks) values ('zools', '{0}', {1}) using ttl 10800;", this.zools[i].Name, dateTime.Ticks);
pocoCommand = iCluster.CreatePocoCommand();
task = pocoCommand.Execute(query).AsFuture();
task.Wait();
}
这适用于小流,但是当这些服务开始捕获大量流时,我得到了这些例外;
System.ArgumentException: Can't find any valid endpoint
以及某些服务;
System.InvalidOperationException: ClusterManager is not initialized
我在每个服务中尝试过这个但是没有工作;
CassandraSharp.Config.XmlConfigurator.Configure();
//push process..
ClusterManager.Shutdown();
对于任何遗漏的信息,我很抱歉,如果有任何信息,我会进行编辑。
谢谢。
答案 0 :(得分:1)
CassandraSharp为您处理所有连接管理和池。您所要做的就是每个应用程序运行CassandraSharp.Config.XmlConfigurator.Configure();
一次。然后,CassandraSharp将根据您的需要为您打开连接。您应该只在应用关闭时致电ClusterManager.Shutdown();
。这是一个代码段from the author of CassandraSharp:
必须调用Configure()一次,而不是更多。如果你想关闭 关闭所有群集连接(假设您的进程正在退出), 然后调用Shutdown()。
Shutdown()正在关闭所有的连接和服务 整个过程 - 它可能会对你的其他人产生不良影响 应用程序,如果您要连接到同一个群集中的多个群集 过程
即使您要连接到多个群集,也应该在XML配置中定义它们,并且仍然只调用Configure()
一次。所以这是一个示例设置。
示例XML配置
<CassandraSharp>
<Cluster name="Dev">
<Transport cl="ONE" cqlver="3.1.1" />
<Endpoints>
<Server>server1.test.com</Server>
</Endpoints>
</Cluster>
<Cluster name="Prod">
<Transport cl="ONE" cqlver="3.1.1" />
<Endpoints>
<Server>server1.test.com</Server>
<Server>server2.test.com</Server>
</Endpoints>
</Cluster>
</CassandraSharp>
示例代码
注意static cluster
。这只会在应用程序中存在一次,因此您不会遇到创建多个实例的问题。
public interface IClusterFactory
{
ICluster GetCluster();
}
public class ClusterFactory : IClusterFactory
{
private static ICluster cluster;
public ICluster GetCluster()
{
if (cluster != null)
{
return cluster;
}
else
{
XmlConfigurator.Configure();
cluster = ClusterManager.GetCluster("Prod");
return cluster;
}
}
}
然后,只要你想连接到Cassandra:
IClusterFactory factory = new ClusterFactory();
ICluster cluster = factory.GetCluster();
IPropertyBagCommand cmd = cluster.CreatePropertyBagCommand();
不要担心在CassandraSharp中处理集群时处理或关闭集群。只需在应用程序关闭时执行ClusterManager.Shutdown()
。