zoukankan      html  css  js  c++  java
  • akka简单示例-1

    刚刚开始接触akka,网上找了2个简单示例,并在公司运营机器上尝试,踩了一些坑,在此记录。

    1. 本地hello world

     1 [torstan@sparkb5-i ~/akka_example/hello_world]$ cat src/helloWorld.scala 
     2 package our.examples
     3 import akka.actor.Actor
     4 import akka.actor.ActorSystem
     5 import akka.actor.Props
     6  
     7 class HelloActor extends Actor {
     8   def receive = {
     9     case "hello" => println("hello back at you")
    10     case _       => println("huh?")
    11   }
    12 }
    13  
    14 object HelloApp extends App {
    15         override def main(args: Array[String]){
    16                 val system = ActorSystem("HelloSystem")
    17                         // default Actor constructor
    18                         val helloActor = system.actorOf(Props[HelloActor], name = "helloactor")
    19                         helloActor ! "hello"
    20                         helloActor ! "buenos dias"
    21         }
    22 }
     1 [torstan@sparkb5-i ~/akka_example/hello_world]$ cat Makefile 
     2 SRC_DIR := src
     3 SRC := $(shell find ${SRC_DIR} -name "*.scala")
     4 DIR=our
     5 
     6 TARGET := HelloApp.jar
     7 
     8 SCALAC := scalac 
     9 SCFLAGS := /usr/local/scala-2.10.4/lib/akka-actors.jar  
    10 
    11 .PHONY: all clean
    12 
    13 all: ${TARGET}
    14 
    15 ${TARGET}: ${SRC}
    16         ${SCALAC} -cp ${SCFLAGS} $^
    17 
    18 clean:
    19         ${RM} -r ${TARGET} ${DIR}
    1 [torstan@sparkb5-i ~/akka_example/hello_world]$ cat run.sh 
    2 #!/bin/bash
    3 
    4 
    5 java -cp 
    6  .:/usr/local/scala-2.10.4/lib/scala-library.jar:/usr/local/scala-2.10.4/lib/akka-actors.jar:/usr/local/scala-2.10.4/lib/typesafe-config.jar
    7   our.examples.HelloApp

    执行结果:

    [torstan@sparkb5-i ~/akka_example/hello_world]$ ./run.sh
    hello back at you
    huh?

    2. 简单CS示例

    server端:

     1 [torstan@sparkb5-i ~/akka_example/remote_service/server]$ cat src/HelloRemote.scala 
     2 package remote
     3 import akka.actor.Actor
     4 import akka.actor.ActorSystem
     5 import akka.actor.Props
     6 
     7 class RemoteActor extends Actor{
     8         def receive = {
     9                 case msg:String =>
    10                         println(s"RemoteActor received message '$msg'")
    11                         sender ! "hello from RemoteActor"
    12         }
    13 }
    14 
    15 object HelloRemote extends App{
    16         val system = ActorSystem("HelloRemoteSystem")
    17         val remoteActor = system.actorOf(Props[RemoteActor], name="RemoteActor")
    18         remoteActor ! "The remote actor is alive"
    19 }
     1 [torstan@sparkb5-i ~/akka_example/remote_service/server]$ cat application.conf 
     2 akka {
     3   loglevel = "DEBUG"
     4   actor {
     5     provider = "akka.remote.RemoteActorRefProvider"
     6    }
     7    remote {
     8      transport = "akka.remote.netty.NettyRemoteTransport"
     9      //log-sent-messages = on
    10      //log-received-messages = on
    11      netty {
    12        hostname = "172.27.6.240"
    13        port = 5150
    14      }
    15    }
    16 }
     1 [torstan@sparkb5-i ~/akka_example/remote_service/server]$ cat Makefile 
     2 SRC_DIR := src
     3 SRC := $(shell find ${SRC_DIR} -name "*.scala")
     4 DIR=remote
     5 
     6 TARGET := HelloRemote.jar
     7 
     8 SCALAC := scalac 
     9 SCFLAGS := /usr/local/scala-2.10.4/lib/akka-actors.jar  
    10 
    11 .PHONY: all clean
    12 
    13 all: ${TARGET}
    14 
    15 ${TARGET}: ${SRC}
    16         ${SCALAC} -cp ${SCFLAGS} $^
    17 
    18 clean:
    19         ${RM} -r ${TARGET} ${DIR}
    1 [torstan@sparkb5-i ~/akka_example/remote_service/server]$ cat run.sh 
    2 #!/bin/bash
    3 
    4 AKKA_LIB_PATH="/usr/local/akka-2.1.4/lib/akka/"
    5 
    6 java -cp 
    7  .:/usr/local/scala-2.10.4/lib/scala-library.jar:/usr/local/scala-2.10.4/lib/akka-actors.jar:/usr/local/scala-2.10.4/lib/typesafe-config.jar:${AKKA_LIB_PATH}/akka-remote_2.10-2.1.4.jar:${AKKA_LIB_PATH}/protobuf-java-2.4.1.jar:${AKKA_LIB_PATH}/netty-3.5.8.Final.jar 
    8  remote.HelloRemote

    client端:

     1 [torstan@sparkb5-i ~/akka_example/remote_service/client]$ cat src/HelloLocal.scala 
     2 package client 
     3 import akka.actor._
     4 
     5 object HelloLocal extends App{
     6         implicit val system = ActorSystem("LocalSystem")
     7         val localActor = system.actorOf(Props[LocalActor], name="LocalActor")
     8         localActor ! "START"
     9 }
    10 
    11 class LocalActor extends Actor{
    12         val remote = context.actorFor("akka://HelloRemoteSystem@172.27.6.240:5150/user/RemoteActor")
    13         var counter = 0
    14         def receive = {
    15                 case "START" =>
    16                         remote ! "HELLO from the LocalActor"
    17                 case msg:String =>
    18                         println(s"LocalActor received message: '$msg'")
    19                         if(counter < 5){
    20                                 sender ! "hello back to you"
    21                                 counter += 1
    22                         }
    23         }
    24 }
     1 [torstan@sparkb5-i ~/akka_example/remote_service/client]$ cat application.conf 
     2 akka {
     3   //loglevel = "DEBUG"
     4   actor {
     5     provider = "akka.remote.RemoteActorRefProvider"
     6   }
     7   remote {
     8     transport = "akka.remote.netty.NettyRemoteTransport"
     9     //log-sent-messages = on
    10     //log-received-messages = on
    11     netty {
    12       hostname = "127.0.0.1"
    13       port = 0
    14     }
    15   }
    16 }
     1 [torstan@sparkb5-i ~/akka_example/remote_service/client]$ cat Makefile 
     2 SRC_DIR := src
     3 SRC := $(shell find ${SRC_DIR} -name "*.scala")
     4 DIR=client
     5 
     6 TARGET := HelloLocal.jar
     7 
     8 SCALAC := scalac 
     9 SCFLAGS := /usr/local/scala-2.10.4/lib/akka-actors.jar  
    10 
    11 .PHONY: all clean
    12 
    13 all: ${TARGET}
    14 
    15 ${TARGET}: ${SRC}
    16         ${SCALAC} -cp ${SCFLAGS} $^
    17 
    18 clean:
    19         ${RM} -r ${TARGET} ${DIR}
    1 [torstan@sparkb5-i ~/akka_example/remote_service/client]$ cat run.sh 
    2 #!/bin/bash
    3 
    4 AKKA_LIB_PATH="/usr/local/akka-2.1.4/lib/akka/"
    5 
    6 java -cp 
    7  .:/usr/local/scala-2.10.4/lib/scala-library.jar:/usr/local/scala-2.10.4/lib/akka-actors.jar:/usr/local/scala-2.10.4/lib/typesafe-config.jar:${AKKA_LIB_PATH}/akka-remote_2.10-2.1.4.jar:${AKKA_LIB_PATH}/protobuf-java-2.4.1.jar:${AKKA_LIB_PATH}/netty-3.5.8.Final.jar 
    8  client.HelloLocal

    执行结果:

    [root@sparkb5-0 /data/torstan/akka_example/remote_service/server]# ./run.sh
    [DEBUG] [12/10/2014 17:31:57.074] [main] [EventStream(akka://HelloRemoteSystem)] logger log1-Logging$DefaultLogger started
    [DEBUG] [12/10/2014 17:31:57.080] [main] [EventStream(akka://HelloRemoteSystem)] Default Loggers started
    [INFO] [12/10/2014 17:31:57.269] [main] [NettyRemoteTransport(akka://HelloRemoteSystem@172.27.6.240:5150)] RemoteServerStarted@akka://HelloRemoteSystem@172.27.6.240:5150
    RemoteActor received message 'The remote actor is alive'
    [INFO] [12/10/2014 17:32:01.768] [HelloRemoteSystem-10] [NettyRemoteTransport(akka://HelloRemoteSystem@172.27.6.240:5150)] RemoteClientStarted@akka://LocalSystem@127.0.0.1:48437
    [DEBUG] [12/10/2014 17:32:01.769] [HelloRemoteSystem-10] [RemoteClient(akka://HelloRemoteSystem)] Starting remote client connection to [akka://LocalSystem@127.0.0.1:48437]
    [DEBUG] [12/10/2014 17:32:01.771] [HelloRemoteSystem-10] [NettyRemoteTransport(akka://HelloRemoteSystem@172.27.6.240:5150)] RemoteServerClientConnected@akka://HelloRemoteSystem@172.27.6.240:5150: Client[akka://LocalSystem@127.0.0.1:48437]
    RemoteActor received message 'HELLO from the LocalActor'
    [DEBUG] [12/10/2014 17:32:01.782] [HelloRemoteSystem-akka.actor.default-dispatcher-2] [akka.serialization.Serialization(akka://HelloRemoteSystem)] Using serializer[akka.serialization.JavaSerializer] for message [java.lang.String]
    RemoteActor received message 'hello back to you'
    RemoteActor received message 'hello back to you'
    RemoteActor received message 'hello back to you'
    RemoteActor received message 'hello back to you'
    RemoteActor received message 'hello back to you'

    [torstan@sparkb5-i ~/akka_example/remote_service/client]$ ./run.sh
    [INFO] [12/10/2014 17:32:01.668] [main] [NettyRemoteTransport(akka://LocalSystem@127.0.0.1:48437)] RemoteServerStarted@akka://LocalSystem@127.0.0.1:48437
    [INFO] [12/10/2014 17:32:01.755] [LocalSystem-akka.actor.default-dispatcher-3] [NettyRemoteTransport(akka://LocalSystem@127.0.0.1:48437)] RemoteClientStarted@akka://HelloRemoteSystem@172.27.6.240:5150
    LocalActor received message: 'hello from RemoteActor'
    LocalActor received message: 'hello from RemoteActor'
    LocalActor received message: 'hello from RemoteActor'
    LocalActor received message: 'hello from RemoteActor'
    LocalActor received message: 'hello from RemoteActor'
    LocalActor received message: 'hello from RemoteActor'

    遇到的坑:

    1. 运行时各种各样的依赖缺失
    比如:

    [torstan@sparkb5-i ~/akka_example/remote_service/client]$ ./run.sh 
    Exception in thread "main" java.lang.ClassNotFoundException: akka.remote.RemoteActorRefProvider
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:270)
    at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(DynamicAccess.scala:68)
    at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(DynamicAccess.scala:67)
    at scala.util.Try$.apply(Try.scala:161)

    google到答案是没有加载依赖文件akka-remote.jar,后来发现是没有安装akka。

    2. Exception in thread "main" java.lang.NoSuchMethodException: akka.remote.RemoteActorRefProvider.<init>(java.lang.String, akka.actor.ActorSystem$Settings, akka.event.EventStream, akka.actor.Scheduler, akka.actor.DynamicAccess

    google到答案:

     
    12 maj 2014 kl. 22:55 skrev Liang Tang <liang...@gmail.com>:
    - show quoted text -
    Yes, Scala 2.10 comes with Akka 2.1.0, which is not binary compatible with Akka 2.3.2. I recommend using sbt to resolve the dependencies instead of manually constructing a command line, i.e. using the runMain task.
     
    Regards,
     
    Roland
    https://groups.google.com/forum/#!topic/akka-user/zibfABh4cs8
     
    因为安装的scala版本scala-2.10.4与akka的版本akka-2.2.4不兼容,scala-2.10.4应该与akka-2.1.4配套使用。
     
     
    参考文献:
    http://alvinalexander.com/scala/simple-scala-akka-actor-examples-hello-world-actors
    http://alvinalexander.com/scala/simple-akka-actors-remote-example
     
  • 相关阅读:
    MySQL常用函数介绍
    SQL语法基础之DROP语句
    MySQL常见报错汇总
    SQL语法基础之SELECT
    SQL语法基础之ALTER语句
    OpenStack技术栈-OpenStack的基础原理概述
    体验Hadoop3.0生态圈-CDH6.1时代的来临
    Windows下强制删除文件或文件夹(解除文件占用/Unlock)
    foreach Transform 同时chils.setParent引起的bug
    CharacterController平滑移动到某点
  • 原文地址:https://www.cnblogs.com/Torstan/p/4155999.html
Copyright © 2011-2022 走看看