akka入门-简单示例

以下程序演示了akka的一个简单的示例。创建Actor去处理一条命令,通过消息传递的方式进行交互。

我使用的akka版本和相关jar包参见pom文件:

<project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion >4.0.0 </modelVersion>

  <groupId >com.focusedu.akka </groupId>
  <artifactId >akka-first</ artifactId>
  <version >0.0.1-SNAPSHOT </version>
  <packaging >jar </packaging>

  <name >akka-first</ name>
  <url >http://maven.apache.org </url>

  <properties >
    <project.build.sourceEncoding> UTF-8</ project.build.sourceEncoding>
  </properties >

  <dependencies >
    <dependency >
      <groupId >junit</groupId>
      <artifactId >junit</artifactId>
      <version >3.8.1 </version>
      <scope >test </scope>
    </dependency >
    <dependency >
         <groupId> com.typesafe.akka</groupId >
         <artifactId> akka-actor_2.10 </artifactId>
         <version> 2.3.10</ version>
     </dependency >
     <dependency >
           <groupId> log4j</ groupId>
           <artifactId> log4j</ artifactId>
           <version> 1.2.17</ version>
     </dependency >
     <dependency >
           <groupId> com.google.guava</groupId >
           <artifactId> guava</artifactId >
           <version> 18.0</ version>
     </dependency >
     <dependency >
        <groupId> ch.qos.logback</groupId >
        <artifactId> logback-classic </artifactId>
        <version> 1.1.1</ version>
    </dependency >
    <dependency >
        <groupId> com.typesafe.akka</groupId >
        <artifactId> akka-persistence-experimental_2.10 </artifactId>
        <version> 2.3.10</ version>
    </dependency >

  </dependencies >
</project>
 

1.创建事件Event

import java.io.Serializable;

public class Event implements Serializable {

  private String data;
  private String uuid;

  public Event(String data) {
    super();
    this. data = data;
  }

  public Event(String data, String uuid) {
    this. data = data;
    this. uuid = uuid;
  }

  public String getData() {
    return data;
  }

  public String getUuid() {
    return uuid;
  }

  @Override
  public String toString() {
    return "Event{" + "data='" + data + '\'' + ", uuid='" + uuid + '\'' + '}' ;
  }
}

2.创建命令对象

其中主要的方法是重写onReceive方法,用于处理接收到的消息。

import java.io.Serializable;

public class Command implements Serializable {
     private static final long serialVersionUID = 1L;
     private final String data ;

     public Command(String data) {
           this.data = data ;
     }

     public String getData() {
           return this .data ;
     }

     @Override
     public String toString() {
           return "Command{" + "data='" + data + '\'' + '}';
     }
}

3.创建Actor对象

import java.util.UUID;

import com.center.akka.simple.command.Command;
import com.center.akka.simple.event.Event;

import akka.actor.UntypedActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;

public class SimpleActor extends UntypedActor {

     LoggingAdapter log = Logging.getLogger(getContext().system(), this);

     public SimpleActor() {
           log.info( "SimpleActor constructor");
     }

     @Override
     public void onReceive(Object msg) throws Exception {

           log.info( "Received Command: " + msg );
           if (msg instanceof Command) {
               final String data = ((Command) msg).getData();
               final Event event = new Event(data, UUID.randomUUID().toString());
               // emmit an event somewhere...

          } else if (msg .equals("echo" )) {
               log.info( "ECHO!");
          }
     }
}

4.测试类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;

import com.center.akka.simple.actor.SimpleActor;
import com.center.akka.simple.command.Command;

/**
 *
 * @author lcq
 *
 */
public class System {

  public static final Logger log = LoggerFactory.getLogger(System.class);

  public static void main(String... args) throws Exception {

    final ActorSystem actorSystem = ActorSystem.create("actor-system");

    Thread.sleep(5000);

    final ActorRef actorRef = actorSystem.actorOf(Props.create(SimpleActor. class), "simple-actor");

    actorRef.tell( new Command("CMD 1" ), null);
    actorRef.tell( new Command("CMD 2" ), null);
    actorRef.tell( new Command("CMD 3" ), null);
    actorRef.tell( new Command("CMD 4" ), null);
    actorRef.tell( new Command("CMD 5" ), null);

    Thread.sleep(5000);

    log.debug( "Actor System Shutdown Starting..." );

    actorSystem.shutdown();
  }
}

需要区分的两个概念是:

actorRef.tell:异步发送一个消息并立即返回;

actorRef.ask:异步发送一条消息并返回一个 Future代表一个可能的回应;

所以总是使用tell更偏向性能,除非必须才用ask

运行结果:

[INFO] [05/17/2015 17:46:44.224] [actor-system-akka.actor.default-dispatcher-3] [akka://actor-system/user/simple-actor] SimpleActor constructor
[INFO] [05/17/2015 17:46:44.225] [actor-system-akka.actor.default-dispatcher-3] [akka://actor-system/user/simple-actor] Received Command: Command{data='CMD 1'}
[INFO] [05/17/2015 17:46:44.312] [actor-system-akka.actor.default-dispatcher-3] [akka://actor-system/user/simple-actor] Received Command: Command{data='CMD 2'}
[INFO] [05/17/2015 17:46:44.312] [actor-system-akka.actor.default-dispatcher-3] [akka://actor-system/user/simple-actor] Received Command: Command{data='CMD 3'}
[INFO] [05/17/2015 17:46:44.312] [actor-system-akka.actor.default-dispatcher-3] [akka://actor-system/user/simple-actor] Received Command: Command{data='CMD 4'}
[INFO] [05/17/2015 17:46:44.312] [actor-system-akka.actor.default-dispatcher-3] [akka://actor-system/user/simple-actor] Received Command: Command{data='CMD 5'}
17:46:49.226 [main] DEBUG com.center.akka.simple.app.System - Actor System Shutdown Starting...
时间: 2024-10-14 07:23:41

akka入门-简单示例的相关文章

AKKA HTTP 简单示例

AKKA HTTP 简单示例 依赖包: compile("com.typesafe.akka:akka-http_2.13:10.1.8") compile("com.typesafe.akka:akka-stream_2.13:2.5.23") 代码示例: package http import akka.actor.ActorSystem import akka.http.javadsl.server.HttpApp import akka.http.javad

Dubbo入门简单示例

之前用过EJB做分布式系统,前段时间跟人闲聊,发现还是Dubbo+ZK用的比较多,so,自己玩玩儿. 先安装一个zk作为服务注册中心,之后,建个maven工程,pom里面加入如下配置: <dependencies> <!-- dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>

RPC学习----Thrift快速入门和Java简单示例

一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI网络通信模型中,RPC跨越了传输层和应用层.RPC使得开发包括网络分布式多程序在内的应用程序更加容易. 二.什么是Thrift? thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和

akka简单示例

刚刚开始接触akka,网上找了2个简单示例,并在公司运营机器上尝试,踩了一些坑,在此记录. 1. 本地hello world 1 [[email protected] ~/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 c

django入门 -- 简单流程

django入门 -- 简单流程 这里简单的演示完成一个 django 大概流程,后面会有详细解释 搭建开发环境 以下使用的是 ubuntu 系统 在生产环境中,有的时候,我们开发的项目可能用的是几个不同的 环境,所以通常我们会创建虚拟环境,在虚拟环境中安装我们需要的 配置,这里从配置虚拟环境开始 创建虚拟环境 创建:mkvirtualenv [虚拟环境名称] 删除:rmvirtualenv [虚拟环境名称] 进入:workon [虚拟环境名称] 退出:deactivate 所有的虚拟环境,都位

WCF入门简单教程(图文) VS2010版

在这个例子中我们将使用VS 2010 创建一个WCF服务,其中会了解 [DataContract] [ServiceContract] 等特性.  内置的 WCFSVCHost ,并使用"WCF测试客户端"来测试我们创建的服务. 注意下面的所有类.接口及方法都添加了public 的访问级别. 一,建立一个WCF服务库 创建一个WCF服务库项目 在解决方案中会自动为我们生成两个类文件"IService1.cs"和"Service1.cs". 这两个

Node.js开发入门—语音合成示例

出于项目需要,搞了一个语音合成(TTS)的小示例,使用的是OKVoice. 我想在PC上测试,OKVoice的快速接入API可以实现我的目的,文档在这里:http://dev.okvoice.com/file.php. 直接上代码吧,okVoiceTts.js,内容如下: var http = require('http'); var fs =require('fs'); var crypto = require('crypto'); var util = require('util'); va

hello MemSQL 入门安装示例

一,介绍 MemSQL号称世界上最快的分布式关系型数据库,兼容mysql但快30倍,能实现每秒150万次事务.原理是仅用内存并将SQL预编译为C++. 二,部署 官网下载地址:http://www.memsql.com/download/ - 安装 $ tar -xzf memsqlbin_amd64.tar.gz $ cd memsqlbin - 启动 $ ./check_system ./memsqld -u root --port 3307 - 关闭 $ killall memsqld 三

AMQP消息队列之RabbitMQ简单示例

前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个图来概览下: 1.添加Maven依赖 <!-- rabbitmq begin --> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit