|
Akka/Scala example source code file (WithUdpSend.scala)
The WithUdpSend.scala Akka example source code/** * Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com> */ package akka.io import java.nio.channels.{ SelectionKey, DatagramChannel } import akka.actor.{ ActorRef, ActorLogging, Actor } import akka.io.Udp.{ CommandFailed, Send } import akka.io.SelectionHandler._ /** * INTERNAL API */ private[io] trait WithUdpSend { me: Actor with ActorLogging ⇒ private var pendingSend: Send = null private var pendingCommander: ActorRef = null // If send fails first, we allow a second go after selected writable, but no more. This flag signals that // pending send was already tried once. private var retriedSend = false private def hasWritePending = pendingSend ne null def channel: DatagramChannel def udp: UdpExt val settings = udp.settings import settings._ def sendHandlers(registration: ChannelRegistration): Receive = { case send: Send if hasWritePending ⇒ if (TraceLogging) log.debug("Dropping write because queue is full") sender() ! CommandFailed(send) case send: Send if send.payload.isEmpty ⇒ if (send.wantsAck) sender() ! send.ack case send: Send ⇒ pendingSend = send pendingCommander = sender() doSend(registration) case ChannelWritable ⇒ if (hasWritePending) doSend(registration) } private def doSend(registration: ChannelRegistration): Unit = { val buffer = udp.bufferPool.acquire() try { buffer.clear() pendingSend.payload.copyToBuffer(buffer) buffer.flip() val writtenBytes = channel.send(buffer, pendingSend.target) if (TraceLogging) log.debug("Wrote [{}] bytes to channel", writtenBytes) // Datagram channel either sends the whole message, or nothing if (writtenBytes == 0) { if (retriedSend) { pendingCommander ! CommandFailed(pendingSend) retriedSend = false pendingSend = null pendingCommander = null } else { registration.enableInterest(SelectionKey.OP_WRITE) retriedSend = true } } else { if (pendingSend.wantsAck) pendingCommander ! pendingSend.ack retriedSend = false pendingSend = null pendingCommander = null } } finally { udp.bufferPool.release(buffer) } } } Other Akka source code examplesHere is a short list of links related to this Akka WithUdpSend.scala source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.