blob: 1ecb1ba6879be9712b4274152890ecdcc8d3be74 [file] [log] [blame]
/*
* 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.servicecomb.pack.alpha.spec.saga.db;
import java.lang.invoke.MethodHandles;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import org.apache.servicecomb.pack.alpha.core.CommandRepository;
import org.apache.servicecomb.pack.alpha.core.EventScanner;
import org.apache.servicecomb.pack.alpha.core.NodeStatus;
import org.apache.servicecomb.pack.alpha.core.OmegaCallback;
import org.apache.servicecomb.pack.alpha.core.TxConsistentService;
import org.apache.servicecomb.pack.alpha.core.TxEventRepository;
import org.apache.servicecomb.pack.alpha.core.TxTimeoutRepository;
import org.apache.servicecomb.pack.alpha.core.api.APIv1;
import org.apache.servicecomb.pack.alpha.core.metrics.AlphaMetricsEndpoint;
import org.apache.servicecomb.pack.alpha.spec.saga.db.api.SagaDbAPIv1Controller;
import org.apache.servicecomb.pack.alpha.spec.saga.db.api.SagaDbAPIv1Impl;
import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.ClusterLockService;
import org.apache.servicecomb.pack.alpha.spec.saga.db.cluster.provider.jdbc.LockProviderJdbcConfiguration;
import org.apache.servicecomb.pack.alpha.spec.saga.db.metrics.AlphaMetricsEndpointImpl;
import org.apache.servicecomb.pack.alpha.spec.saga.db.metrics.MetricsService;
import org.apache.servicecomb.pack.alpha.spec.saga.db.properties.SpecSagaDbProperties;
import org.apache.servicecomb.pack.alpha.spec.saga.db.test.AlphaEventController;
import org.apache.servicecomb.pack.common.AlphaMetaKeys;
import org.apache.servicecomb.pack.contract.grpc.ServerMeta;
import org.apache.servicecomb.pack.persistence.jpa.EclipseLinkJpaConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Profile;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@Configuration
@ImportAutoConfiguration({SpecSagaDbProperties.class, EclipseLinkJpaConfiguration.class,
LockProviderJdbcConfiguration.class})
@EnableJpaRepositories(basePackages = "org.apache.servicecomb.pack.alpha.spec.saga.db")
@ConditionalOnExpression("'${alpha.spec.names}'.contains('saga-db')")
public class AlphaSpecSagaDbAutoConfiguration {
private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
public AlphaSpecSagaDbAutoConfiguration() {
LOG.info("Alpha Specification Saga DB");
}
@Bean
@Primary
public DataSourceProperties dataSourceProperties(SpecSagaDbProperties specSagaDbProperties) {
return specSagaDbProperties.getDatasource();
}
@Bean
CommandRepository springCommandRepository(TxEventEnvelopeRepository eventRepo,
CommandEntityRepository commandRepository) {
return new SpringCommandRepository(eventRepo, commandRepository);
}
@Bean
TxTimeoutRepository springTxTimeoutRepository(TxTimeoutEntityRepository timeoutRepo) {
return new SpringTxTimeoutRepository(timeoutRepo);
}
@Bean
TxEventRepository springTxEventRepository(TxEventEnvelopeRepository eventRepo) {
return new SpringTxEventRepository(eventRepo);
}
@Bean
TxConsistentService txConsistentService(
@Value("${alpha.event.pollingInterval:500}") int eventPollingInterval,
@Value("${alpha.event.scanner.enabled:true}") boolean eventScannerEnabled,
ScheduledExecutorService scheduler,
TxEventRepository eventRepository,
CommandRepository commandRepository,
TxTimeoutRepository timeoutRepository,
OmegaCallback omegaCallback,
NodeStatus nodeStatus) {
if (eventScannerEnabled) {
new EventScanner(scheduler,
eventRepository, commandRepository, timeoutRepository,
omegaCallback, eventPollingInterval, nodeStatus).run();
LOG.info("Starting the EventScanner.");
}
TxConsistentService consistentService = new TxConsistentService(eventRepository);
return consistentService;
}
@Bean
GrpcTxEventEndpointImpl grpcTxEventEndpoint(TxConsistentService txConsistentService,
Map<String, Map<String, OmegaCallback>> omegaCallbacks) {
ServerMeta serverMeta = ServerMeta.newBuilder()
.putMeta(AlphaMetaKeys.AkkaEnabled.name(), String.valueOf(false)).build();
return new GrpcTxEventEndpointImpl(txConsistentService, omegaCallbacks, serverMeta);
}
@Bean
ClusterLockService clusterLockService() {
return new ClusterLockService();
}
@Bean
public MetricsService metricsService() {
return new MetricsService();
}
@Bean
AlphaMetricsEndpoint alphaMetricsEndpoint(){
return new AlphaMetricsEndpointImpl();
}
@Bean
SagaDbAPIv1Controller apIv1Controller(){
return new SagaDbAPIv1Controller();
}
@Bean
APIv1 apIv1(){
return new SagaDbAPIv1Impl();
}
@Bean
@Profile("test")
AlphaEventController alphaEventController(TxEventEnvelopeRepository eventRepository){
return new AlphaEventController(eventRepository);
}
}