cassandra clustermanager和端点异常

时间:2014-04-17 07:49:22

标签: cassandra cassandra-sharp

我在一个解决方案中使用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();

对于任何遗漏的信息,我很抱歉,如果有任何信息,我会进行编辑。

谢谢。

1 个答案:

答案 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()