/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.usergrid.persistence.qakka.serialization.queues.impl; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Row; import com.datastax.driver.core.Statement; import com.datastax.driver.core.querybuilder.Clause; import com.datastax.driver.core.querybuilder.QueryBuilder; import com.google.inject.Inject; import org.apache.usergrid.persistence.core.CassandraConfig; import org.apache.usergrid.persistence.core.astyanax.MultiTenantColumnFamilyDefinition; import org.apache.usergrid.persistence.core.datastax.TableDefinition; import org.apache.usergrid.persistence.core.datastax.impl.TableDefinitionStringImpl; import org.apache.usergrid.persistence.qakka.core.CassandraClient; import org.apache.usergrid.persistence.qakka.serialization.queuemessages.impl.QueueMessageSerializationImpl; import org.apache.usergrid.persistence.qakka.serialization.queues.DatabaseQueue; import org.apache.usergrid.persistence.qakka.serialization.queues.QueueSerialization; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; public class QueueSerializationImpl implements QueueSerialization { private static final Logger logger = LoggerFactory.getLogger( QueueSerializationImpl.class ); private final CassandraClient cassandraClient; private final CassandraConfig cassandraConfig; public final static String COLUMN_QUEUE_NAME = "queue_name"; public final static String COLUMN_REGIONS = "regions"; public final static String COLUMN_DEFAULT_DESTINATIONS = "default_destinations"; public final static String COLUMN_DEFAULT_DELAY_MS = "default_delay_ms"; public final static String COLUMN_RETRY_COUNT = "retry_count"; public final static String COLUMN_HANDLING_TIMEOUT_SEC = "handling_timeout_sec"; public final static String COLUMN_DEAD_LETTER_QUEUE = "dead_letter_queue"; public final static String TABLE_QUEUES = "queues"; static final String CQL = "CREATE TABLE IF NOT EXISTS queues ( " + "queue_name text, " + "regions text, " + "default_destinations text, " + "default_delay_ms bigint, " + "retry_count int, " + "handling_timeout_sec int, " + "dead_letter_queue text, " + "PRIMARY KEY ((queue_name)) " + "); "; @Inject public QueueSerializationImpl( CassandraConfig cassandraConfig, CassandraClient cassandraClient ) { this.cassandraConfig = cassandraConfig; this.cassandraClient = cassandraClient; } @Override public void writeQueue(DatabaseQueue queue) { logger.trace( "writeQueue " + queue.getName() ); Statement insert = QueryBuilder.insertInto(TABLE_QUEUES) .value(COLUMN_QUEUE_NAME, queue.getName()) .value(COLUMN_REGIONS, queue.getRegions()) .value(COLUMN_DEFAULT_DESTINATIONS, queue.getDefaultDestinations()) .value(COLUMN_DEFAULT_DELAY_MS, queue.getDefaultDelayMs()) .value(COLUMN_RETRY_COUNT, queue.getRetryCount()) .value(COLUMN_HANDLING_TIMEOUT_SEC, queue.getHandlingTimeoutSec()) .value(COLUMN_DEAD_LETTER_QUEUE, queue.getDeadLetterQueue()); cassandraClient.getApplicationSession().execute(insert); } @Override public DatabaseQueue getQueue(String name) { logger.trace( "getQueue " + name ); Clause queueNameClause = QueryBuilder.eq(COLUMN_QUEUE_NAME, name); Statement query = QueryBuilder.select().all().from(TABLE_QUEUES) .where(queueNameClause); Row row = cassandraClient.getApplicationSession().execute(query).one(); if(row == null){ return null; } final String queueName = row.getString(COLUMN_QUEUE_NAME); final String regions = row.getString(COLUMN_REGIONS); final String defaultDestinations = row.getString(COLUMN_DEFAULT_DESTINATIONS); final long defaultDelayMs = row.getLong(COLUMN_DEFAULT_DELAY_MS); final int retryCount = row.getInt(COLUMN_RETRY_COUNT); final int handlingTimeoutSec = row.getInt(COLUMN_HANDLING_TIMEOUT_SEC); final String deadLetterQueue = row.getString(COLUMN_DEAD_LETTER_QUEUE); return new DatabaseQueue( queueName, regions, defaultDestinations, defaultDelayMs, retryCount, handlingTimeoutSec, deadLetterQueue); } @Override public void deleteQueue(String name) { logger.trace( "deleteQueue " + name ); Clause queueNameClause = QueryBuilder.eq(COLUMN_QUEUE_NAME, name); Statement delete = QueryBuilder.delete().from(TABLE_QUEUES) .where(queueNameClause); cassandraClient.getApplicationSession().execute(delete); } @Override public List<String> getListOfQueues() { logger.trace( "getListOfQueues " ); Statement select = QueryBuilder.select().all().from( TABLE_QUEUES ); ResultSet rs = cassandraClient.getApplicationSession().execute( select ); return rs.all().stream() .map( row -> row.getString( COLUMN_QUEUE_NAME )) .collect( Collectors.toList() ); } @Override public Collection<MultiTenantColumnFamilyDefinition> getColumnFamilies() { return Collections.EMPTY_LIST; } @Override public Collection<TableDefinition> getTables() { return Collections.singletonList( new TableDefinitionStringImpl( cassandraConfig.getApplicationKeyspace(), "queues", CQL ) ); } }