美文网首页
Scala异步消息演示

Scala异步消息演示

作者: FredricZhu | 来源:发表于2020-09-06 07:35 被阅读0次

注意要使用Actor,scala版本必须在2.10.
想起多年前的一个Android,IOS双机通信演示程序。
用的全局变量同步。
感觉用这个是不是更好点。

Messages.scala

package com.sensetime.asyncdemo

case object StartMessage
case object StartedMessage

case object StopMessage
case object StoppedMessage

case class AsyncMessage(val id: Int, val message: String)
case class ReplyMessage(val id: Int, val message: String)

AsyncMsgDemo.scala

package com.sensetime.asyncdemo

import scala.actors.Actor


// 用于实现消息接收的Actor类
object Actor4 extends Actor {
  override def act(): Unit = {

    while (true) {
      receive {
            // 接收到start消息,回返StartedMessage,可以开始通信了
        case StartMessage => {
          println("starting...")
          sender ! StartedMessage
        }
          // 接收到异步消息,打印消息,等待1秒,回返消息
        case AsyncMessage(id, message) => {
          println(s"id: $id, message: $message")
          Thread.sleep(1000)
          sender ! ReplyMessage(5, "success")
        }
          // 接收到停止消息,停止消息接收,退出
        case StopMessage => {
          println("stop message processing...")
          sender ! StoppedMessage
          return
        }
        case _ => println("wrong message, not process")
      }
    }
  }
}

object Actor3 extends Actor {

  // 类保留一个actor4实例
  val actor4 = Actor4


  override def act(): Unit = {
    // 消息发送标志位,置位后可发消息
    var sendMsgFlag = false
    // 发送一个 Start Message消息,启动消息循环,类似注册
    actor4 ! StartMessage

    var i = 0

    while (true) {
      // 如果消息位置位,可以发消息
      if (sendMsgFlag) {
        actor4 ! AsyncMessage(i, "异步消息")
        i += 1
      }

      // 仅发送10次,停止发送
      if (i == 10) {
        actor4 ! StopMessage
      }

      // 死等直到接收到某个消息
      receive {
            // 接收开始发送消息的消息
        case StartedMessage => {
          println("Start to send Message!!")
          // 置位消息发送标志
          sendMsgFlag = true
        }
          // 接收到异步消息的返回消息,打印消息
        case ReplyMessage(id, message) => {
          println(s"$id--> $message")
        }
          // 接收到停止消息,退出程序
        case StoppedMessage => {
          println("Message process has stopped...")
          // 收到StoppedMessage,直接return,让程序退出
          return
        }
      }
    }

  }
}

object AsyncMsgDemo {
  def main(args: Array[String]): Unit = {
    Actor3.start()
    Actor4.start()
  }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
    <artifactId>scala-actor-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-actors</artifactId>
            <version>2.10.5</version>
        </dependency>
    </dependencies>


</project>

输出


图片.png

相关文章

  • Scala异步消息演示

    注意要使用Actor,scala版本必须在2.10.想起多年前的一个Android,IOS双机通信演示程序。用的全...

  • Java8并发编程(使用CompletableFuture)

    java8异步处理 非阻塞IO/异步/并行 使用场景 scala事件驱动 Java CompletableFutu...

  • 初识Kafka

    Kafka是由scala和java编写的一款高吞吐量分布式发布订阅消息系统。 应用场景: 异步处理 应用解耦 流量...

  • Scala Reactive Extensions

    Scala Reactive Extensions 由来: 异步编程(Future)避免了blocking,并且提...

  • Python使用RabbitMQ(AMQP)极简例子

    本文主要演示Windows下的,CentOS也提一下安装。 简介 RabbitMQ是一个异步的消息队列服务器程序,...

  • 异步Servlet 特性

    异步Servlet 本篇主要讲解 如何使用 异步Servlet的处理请求,并且演示 同步Servlet和异步Ser...

  • php异步调用测试【学习】

    php异步调用测试 访问的脚本 异步处理脚本 演示效果一直接浏览器访问(点击图片放大) 演示效果二ajax请求(点...

  • Scala Future

    Future scala.concurrent.Future 异步执行代码块import java.time._i...

  • 异步消息

    异步消息有两个主要的概念:消息代理(message broker)和目的地(destination)。当一个应用发...

  • Android异步处理机制:Handler,Looper,Mes

    Android异步处理机制:Handler,Looper,MessageQueue 异步处理消息概念: 异步消息处...

网友评论

      本文标题:Scala异步消息演示

      本文链接:https://www.haomeiwen.com/subject/haiqektx.html