Ok, light at the end of the tunnel, this is what fails.
I'd call that silently swallows.
Essentially the only indication of anything wrong is that the persistence
stores nothing.
I think this is a plugin bug in the in-memory plugin and a thus by
implication TCK issue. Should I raise the TCK issue?
Switching to postgres aysnc and I do get a proper error message. It doesn't
tell me why but it does tell me it went wrong.
package com.optrak.vrp.ddd
import akka.actor.{ActorLogging, PoisonPill, Props}
import akka.persistence.PersistentActor
import com.optrak.opkakka.test.TestSupport.AkkaTestkitContext
import com.optrak.vrp.ddd.SimplePersistor.PersistMe
import org.specs2.mutable.Specification
/**
* Created by tim on 21/02/16.
*/
object SimplePersistor {
case class PersistMe(k: AnyRef)
case class GotBack(kOpt: Option[AnyRef])
case object Request
def props[K] = Props(new SimplePersistor)
}
import SimplePersistor._
class SimplePersistor extends PersistentActor with ActorLogging {
var local: Option[AnyRef] = None
def handler(msg: PersistMe) = {
local = Some(msg.k)
}
override def receiveRecover: Receive = {
case pm: PersistMe =>
local = Some(pm.k)
}
override def receiveCommand: Receive = {
case pm: PersistMe =>
persist(pm)(handler)
case Request =>
sender ! GotBack(local)
}
override def persistenceId: String = "simplePeristor"
}
class TestAkkaSerializability extends Specification {
sequential //our set always has the same persistence id, so have to
trait Checkit extends AkkaTestkitContext {
def checkItOut(k: AnyRef) = {
val persy1 = system.actorOf(SimplePersistor.props)
persy1 ! Request
expectMsg(GotBack(None))
persy1 ! PersistMe(k)
persy1 ! Request
expectMsg(GotBack(Some(k)))
persy1 ! PoisonPill
Thread.sleep(200)
val persy2 = system.actorOf(SimplePersistor.props)
persy2 ! Request
expectMsg(GotBack(Some(k)))
}
}
"persistent set" should {
"work with String" in new Checkit() {
checkItOut("ho")
}
"fails with unserializable" in new Checkit() {
val x = 1
case class Thing(y: Int)
val tricky = new Thing(2) {
def xMe = x
}
checkItOut(tricky)
}
}
}
assertion failed: expected GotBack(Some(Thing(2))), found GotBack(None)
java.lang.AssertionError: assertion failed: expected
GotBack(Some(Thing(2))), found GotBack(None)
my log file
2016-02-21 12:08:42,871 - INFO - from akka.event.slf4j.Slf4jLogger Slf4jLogger
started
2016-02-21 12:08:43,160 - WARN - from
akka.serialization.Serialization(akka://default) Using the default Java
serializer for class [com.optrak.vrp.ddd.SimplePersistor$PersistMe] which is
not recommended because of performance implications. Use another serializer or
disable this warning using the setting
'akka.actor.warn-about-java-serializer-usage'
2016-02-21 12:08:43,572 - INFO - from akka.event.slf4j.Slf4jLogger Slf4jLogger
started
2016-02-21 12:08:43,604 - WARN - from
akka.serialization.Serialization(akka://default) Using the default Java
serializer for class [com.optrak.vrp.ddd.SimplePersistor$PersistMe] which is
not recommended because of performance implications. Use another serializer or
disable this warning using the setting
'akka.actor.warn-about-java-serializer-usage'
relevant bit of config
akka {
loglevel = DEBUG
logger-startup-timeout = 30s
logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
actor.debug.fsm = true
loggers = ["akka.event.slf4j.Slf4jLogger"]
extensions = ["com.romix.akka.serialization.kryo.KryoSerializationExtension$"]
persistence {
// journal.plugin = "akka-persistence-sql-async.journal"
// snapshot-store.plugin = "akka-persistence-sql-async.snapshot-store"
journal.plugin = "inmemory-journal"
snapshot-store.plugin = "inmemory-snapshot-store"
journal-plugin-fallback {
replay-filter {
mode = fail
}
}
}
//----------------- Kryo config ----------------------
actor {
serialize-messages = off
serializers {
java = "akka.serialization.JavaSerializer"
# Define kryo serializer
kryo = "com.romix.akka.serialization.kryo.KryoSerializer"
}
serialization-bindings {
"java.io.Serializable" = java
}
kryo {
type = "nograph"
idstrategy = "default"
kyro-trace = true
}
}
}
On Sunday, February 21, 2016 at 9:52:57 AM UTC, Tim Pigden wrote:
>
> I've just spent a few hours tracking down a mysterious failure in
> previously working code that used akka persistence.
> Eventually I tracked it down to the fact that akka persistence silently
> swallows non-serializable messages with no warning.
> Now I appreciate that
> serialize-message = on
> is a documented setting and it does the job.
>
> But it's kinda hidden way down the serialization page in the docs.
> And since at least 2 serializers (default java and contributed kyro) need
> no configuration, and there's a big red warning not to use it in
> production, it is quite likely that people will not see it or not think to
> turn it on.
>
> So firstly, is it that hard to efficiently report on a failed attempt at
> serialization at run time, for normal use? After all - it's got to be a
> programming error hasn't it? At least in akka-persistence.
> Secondly, perhaps users of akka persistence should get a strong
> recommendation in the docs to turn it on in their tests.
>
> ------------------------------------
> “But the plans were on display…”
> “On display? I eventually had to go down to the cellar to find them.”
> “That’s the display department.”
> “With a flashlight.”
> “Ah, well, the lights had probably gone.”
> “So had the stairs.”
> “But look, you found the notice, didn’t you?”
> “Yes,” said Arthur, “yes I did. It was on display in the bottom of a
> locked filing cabinet stuck in a disused lavatory with a sign on the door
> saying ‘Beware of the Leopard.”
> The Hitchhiker's Guide to the Galaxy
>
>
>
--
>>>>>>>>>> Read the docs: http://akka.io/docs/
>>>>>>>>>> Check the FAQ:
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>> Search the archives: https://groups.google.com/group/akka-user
---
You received this message because you are subscribed to the Google Groups "Akka
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.