Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. package contexts.cart.cluster;
  2.  
  3. import akka.actor.ActorRef;
  4. import akka.actor.ActorSystem;
  5. import akka.actor.CoordinatedShutdown;
  6. import akka.actor.Props;
  7. import akka.cluster.sharding.ClusterSharding;
  8. import akka.cluster.sharding.ClusterShardingSettings;
  9. import akka.cluster.sharding.ShardRegion;
  10. import akka.event.Logging;
  11. import akka.event.LoggingAdapter;
  12. import akka.pattern.PatternsCS;
  13. import com.google.inject.Inject;
  14. import com.google.inject.Singleton;
  15. import contexts.cart.api.CartItem;
  16. import contexts.cart.api.CartService;
  17. import play.api.Application;
  18. import play.api.Play;
  19. import scala.concurrent.duration.FiniteDuration;
  20. import sun.misc.Signal;
  21.  
  22. import javax.inject.Provider;
  23. import java.util.List;
  24. import java.util.concurrent.CompletionStage;
  25.  
  26. @Singleton
  27. public class CartClusterService implements CartService {
  28.  
  29. private final Integer numberOfShards = 100; //don't change after running!!
  30. private final ActorRef shardRegion;
  31. private final LoggingAdapter log;
  32. @Inject
  33. public CartClusterService(ActorSystem system, Provider<Application> applicationProvider) {
  34. log = Logging.getLogger(system, this);
  35.  
  36. ShardRegion.MessageExtractor extractor = new ShardRegion.MessageExtractor() {
  37. @Override
  38. public String entityId(Object message) {
  39. if(message instanceof CartMessage){
  40. return ((CartMessage) message).getUserId();
  41. } else {
  42. throw new Error("message does not implement CartMessage!");
  43. }
  44. }
  45.  
  46. /**
  47. * See also ShardRegion.HashCodeMessageExtractor
  48. * @param message
  49. * @return
  50. */
  51. @Override
  52. public String shardId(Object message) {
  53. if(message instanceof CartMessage){
  54. String shardId = String.valueOf(((CartMessage) message).getUserId().hashCode() % numberOfShards);
  55. return shardId;
  56. } else {
  57. throw new Error("message does not implement CartMessage!");
  58. }
  59. }
  60.  
  61. @Override
  62. public Object entityMessage(Object message) {
  63. System.out.println("entity message " + message);
  64. return message;
  65. }
  66. };
  67.  
  68. ClusterShardingSettings settings = ClusterShardingSettings.create(system);
  69. shardRegion = ClusterSharding.get(system).start("RE-Cart",
  70. Props.create(Cart.class), settings, extractor);
  71.  
  72. /**
  73. * We can grab the signal from play, call coordinated shutdown on akka. That should bring down the house.
  74. * This should be refactored toward somewhere more general. Previously you'd need to manually do the graceful exit
  75. * But now Akka takes care of it.
  76. */
  77. Signal.handle(new Signal("TERM"), new sun.misc.SignalHandler() {
  78. @Override
  79. public void handle(Signal signal) {
  80.  
  81. CoordinatedShutdown.get(system).runAll();
  82.  
  83. try{
  84. Thread.sleep(10000);
  85. }catch(Exception e) {
  86. }
  87.  
  88. system.scheduler().scheduleOnce(FiniteDuration.apply(10, "seconds"), () -> {
  89. Play.stop(applicationProvider.get());
  90. }, system.dispatcher());
  91. }
  92. });
  93.  
  94. }
  95.  
  96. @Override
  97. public CompletionStage emptyCart(String userId) {
  98. return PatternsCS.ask(shardRegion, new EmptyCart(userId), 2000);
  99. }
  100.  
  101. @Override
  102. public CompletionStage updateCartItems(String userId, List<CartItem> cartItems){
  103. return PatternsCS.ask(shardRegion, new UpdateCart(userId, cartItems), 2000);
  104. }
  105.  
  106. @Override
  107. public CompletionStage<List<CartItem>> getCartContents(String userId){
  108. CompletionStage result = PatternsCS.ask(shardRegion, new GetContents(userId), 2000);
  109. return (CompletionStage<List<CartItem>>) result;
  110. }
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement