/*
* 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.distributed.impl;
import akka.actor.ActorSystem;
import akka.actor.PoisonPill;
import akka.actor.Props;
import akka.cluster.singleton.ClusterSingletonManager;
import akka.cluster.singleton.ClusterSingletonManagerSettings;
import akka.cluster.singleton.ClusterSingletonProxy;
import akka.cluster.singleton.ClusterSingletonProxySettings;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Singleton;
import org.apache.usergrid.persistence.actorsystem.ActorSystemManager;
import org.apache.usergrid.persistence.actorsystem.GuiceActorProducer;
import org.apache.usergrid.persistence.actorsystem.RouterProducer;
import org.apache.usergrid.persistence.qakka.QakkaFig;
import org.apache.usergrid.persistence.qakka.distributed.actors.QueueActorRouter;
import org.apache.usergrid.persistence.qakka.distributed.messages.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@Singleton
public class QueueActorRouterProducer implements RouterProducer {
static Injector injector;
ActorSystemManager actorSystemManager;
QakkaFig qakkaFig;
@Inject
public QueueActorRouterProducer(
Injector injector,
ActorSystemManager actorSystemManager,
QakkaFig qakkaFig) {
this.injector = injector;
this.actorSystemManager = actorSystemManager;
this.qakkaFig = qakkaFig;
}
@Override
public String getRouterPath() {
return "/user/queueActorRouterProxy";
}
@Override
public void produceRouter(ActorSystem system, String role) {
ClusterSingletonManagerSettings settings =
ClusterSingletonManagerSettings.create( system ).withRole( "io" );
system.actorOf( ClusterSingletonManager.props(
Props.create( GuiceActorProducer.class, QueueActorRouter.class ),
PoisonPill.getInstance(), settings ), "queueActorRouter" );
ClusterSingletonProxySettings proxySettings =
ClusterSingletonProxySettings.create( system ).withRole( role );
system.actorOf(
ClusterSingletonProxy.props( "/user/queueActorRouter", proxySettings ), "queueActorRouterProxy" );
}
@Override
public void addConfiguration(Map<String, Object> configMap) {
int numInstancesPerNode = qakkaFig.getNumQueueActors();
Map<String, Object> akka = (Map<String, Object>) configMap.get( "akka" );
final Map<String, Object> deploymentMap;
if ( akka.get( "actor" ) == null ) {
deploymentMap = new HashMap<>();
akka.put( "actor", new HashMap<String, Object>() {{
put( "deployment", deploymentMap );
}} );
} else if (((Map) akka.get( "actor" )).get( "deployment" ) == null) {
deploymentMap = new HashMap<>();
((Map) akka.get( "actor" )).put( "deployment", deploymentMap );
} else {
deploymentMap = (Map<String, Object>) ((Map) akka.get( "actor" )).get( "deployment" );
}
deploymentMap.put( "/queueActorRouter/singleton/router", new HashMap<String, Object>() {{
put( "router", "consistent-hashing-pool" );
put( "cluster", new HashMap<String, Object>() {{
put( "enabled", "on" );
put( "allow-local-routees", "on" );
put( "use-role", "io" );
put( "max-nr-of-instances-per-node", numInstancesPerNode );
put( "failure-detector", new HashMap<String, Object>() {{
put( "threshold", "10" );
put( "acceptable-heartbeat-pause", "3 s" );
put( "heartbeat-interval", "1 s" );
put( "heartbeat-request", new HashMap<String, Object>() {{
put( "expected-response-after", "3 s" );
}} );
}} );
}} );
}} );
}
@Override
public Collection<Class> getMessageTypes() {
return new ArrayList() {{
add( QueueGetRequest.class );
add( QueueInitRequest.class );
add( QueueRefreshRequest.class );
add( QueueTimeoutRequest.class );
add( ShardCheckRequest.class );
}};
}
}