1

Hector経由でCassandra dbに接続しています。

(意図的に) 間違ったソケットを指定すると、次のメッセージで接続が失敗します。

INFO CassandraHostRetryService - Downed Host Retry service started with queue size -1 and retry delay 10s
ERROR HConnectionManager - Could not start connection pool for host 132.202.35.14(160.202.35.14):9160
INFO CassandraHostRetryService - Host detected as down was added to retry queue: 132.202.35.14(160.202.35.14):9160
INFO JmxMonitor - Registering JMX me.prettyprint.cassandra.service_RTBCluster:ServiceType=hector,MonitorType=hector

java.net.ConnectException: Connection timed out: connectそして、数秒ごとに試行を続けます。接続が成功したら、いくつかのアクションを実行したいので、接続が失敗したか成功したかを知りたいです。

私のコードは次のようになります。

CassandraHostConfigurator cassandraHostConfigurator = new CassandraHostConfigurator(this.socket);
cluster = new ThriftCluster(this.clusterName, cassandraHostConfigurator);
ConfigurableConsistencyLevel consistencyLevelPolicy = new ConfigurableConsistencyLevel();
consistencyLevelPolicy.setDefaultReadConsistencyLevel(getConsistencyLevelPolicy());
keyspace = HFactory.createKeyspace(keyspaceName, cluster, consistencyLevelPolicy);
fireConnectionEvent(true);

ご覧のとおり、接続イベントを発生させていますが、接続が成功したか失敗したかに関係なく、接続イベントを発生させています。この 2 つを区別する方法はありません。キャッチできるイベントや、接続状態を通知できる他の方法はありますか?

4

1 に答える 1

0

I'm not sure it's the optimal way, but since I could not find a better answer this is what I did:

Created this method:

private boolean isConnected() {
List<KeyspaceDefinition> keyspaces = null;
try {
    keyspaces = cluster.describeKeyspaces();
} catch (HectorException e) {
    return false;
}
return (!CollectionUtils.isEmpty(keyspaces));
}

and then:

    if (isConnected())
    fireConnectionEvent(true);
    else {
    LOG.error("Could not connect to socket " + this.socket + ". Connection to Cassandra is down!!!");
    }
于 2013-08-11T06:13:43.210 に答える