Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
  • 16:05
    Zetanova commented #4032
  • Nov 16 16:14
    IgorFedchenko commented #4032
  • Nov 16 13:19
    ismaelhamed synchronize #4042
  • Nov 16 13:17
    ismaelhamed commented #3863
  • Nov 16 11:47
    IgorFedchenko synchronize #4032
  • Nov 16 11:47
    IgorFedchenko commented #4032
  • Nov 16 11:21
    ismaelhamed synchronize #3863
  • Nov 16 11:17
    ismaelhamed edited #3863
  • Nov 16 11:17
    ismaelhamed synchronize #4042
  • Nov 16 09:58
    IgorFedchenko synchronize #4032
  • Nov 16 09:49
    IgorFedchenko synchronize #4032
  • Nov 16 09:45
    IgorFedchenko commented #4032
  • Nov 16 09:17
    ismaelhamed opened #4043
  • Nov 16 09:03
    ismaelhamed opened #4042
  • Nov 16 09:03
    IgorFedchenko commented #4032
  • Nov 16 08:59
    IgorFedchenko synchronize #4032
  • Nov 16 08:57
    IgorFedchenko synchronize #4032
  • Nov 15 22:35
    Aaronontheweb commented #4032
  • Nov 15 20:26
    IgorFedchenko synchronize #4032
  • Nov 15 20:24
    IgorFedchenko commented #4032
Aaron Stannard
@Aaronontheweb
going to be starting on that project soon-ish
Aaron Stannard
@Aaronontheweb
@smitcham doh, found a bug in the Akka.DI.TestKit because of that: akkadotnet/Akka.DI.Unity#4
already have a fix up for it: akkadotnet/akka.net#2189
fouimette
@fouimette
Is there a list of Hocon configuration options? I am looking for that dead letter logging option. Even better, where in the source can i find this option?
Steven Mitcham
@smitcham
@Aaronontheweb Here's the updated pull request. Let me know if it needs anything else akkadotnet/Akka.DI.Unity#5
Aaron Stannard
@Aaronontheweb
@fouimette the Config namespaces for each module have reference files built into them
check out the source
Arsene T. Gandote
@Tochemey
Hello how do I use EventFilter to test dead letters?
Arsene T. Gandote
@Tochemey
Hello How can I test the Event Bus pub/sub feature?
Bartosz Sypytkowski
@Horusiath
@Tochemey you can subscribe test actor or probe to event bus and verify it after publishing an event
Arsene T. Gandote
@Tochemey

@Horusiath I am doing some test of an Actor that supposes to write into file upon receiving every event. The actor subscribes to the type of event to receive. However when I published N number of events to the event bus the actor only act on the first event by writing it into the file. The others are kind of ignored. This is the test code

            ActorSystemRefs.ActorSystem = Sys;
            var actorSystem = ActorSystemRefs.ActorSystem;

            var loggingActor =
                actorSystem.ActorOf(Props.Create(() => new FileLoggerActor()));
            actorSystem.EventStream.Subscribe(loggingActor, typeof (AuditLog));
            actorSystem.EventStream.Subscribe(TestActor, typeof(Acknowleged));

            Within(TimeSpan.FromSeconds(timeout),
                () =>
                {
                    actorSystem.EventStream.Publish(new AuditLog(GuidFactory.Create().ToString(), DateTime.UtcNow, "me", "0000", "debit1", "mobile"));
                    actorSystem.EventStream.Publish(new AuditLog(GuidFactory.Create().ToString(), DateTime.UtcNow, "me", "0000", "debit2", "mobile"));
                    actorSystem.EventStream.Publish(new AuditLog(GuidFactory.Create().ToString(), DateTime.UtcNow, "me", "0000", "debit3", "mobile"));
                    var result = ExpectMsgAllOf<Acknowleged>();

                    Assert.NotNull(result);
                });

and this is the Actor:

    public class FileLoggerActor : ReceiveActor
    {
        private static string _filePath;


        public FileLoggerActor()
        {
            Ready();
        }

        public override void AroundPreStart()
        {
            ReadConfiguration();
        }

        public sealed override void Ready()
        {
            Receive<AuditLog>(log =>
            {
                WriteToFile(log);
                // This code is for testing purpose
                ActorSystemRefs.PushEvent(new Acknowleged(log));
            });
        }

        private static void ReadConfiguration()
        {
            _filePath = ConfigurationManager.AppSettings["FileLogger.FilePath"];
            if (_filePath == null)
            {
                throw new ConfigurationErrorsException(
                    "Configuration appSetting FileLogger.FilePath not" +
                    "found for FileLogger actor.");
            }

            // If audit trail file path is a relative file path, 
            // convert it to an absolute path.
            _filePath = _filePath.Replace("~", AppDomain.CurrentDomain.BaseDirectory);
        }

        private static void WriteToFile(AuditLog log)
        {
            var jsonString = JsonConvert.SerializeObject(log, Formatting.None);
            File.AppendAllText(_filePath, jsonString + Environment.NewLine);
        }
    }
Arjen Smits
@Danthar
@Tochemey what if you pass the TestProbe as an dependency in your FileLoggerActor constructor, and use that reference? Instead of your 'ActorSystemRefs.PushEvent'
voltcode
@voltcode
Fxfsl
voltcode
@voltcode
Oops mobile, soz
Bartosz Sypytkowski
@Horusiath
@Tochemey what about this?:
actorSystem.EventStream.Publish(new AuditLog(GuidFactory.Create().ToString(), DateTime.UtcNow, "me", "0000", "debit1", "mobile"));
ExpectMsg<Acknowleged>(x=> x.Property == "debit1");
actorSystem.EventStream.Publish(new AuditLog(GuidFactory.Create().ToString(), DateTime.UtcNow, "me", "0000", "debit2", "mobile"));
ExpectMsg<Acknowleged>(x=> x.Property == "debit2");
actorSystem.EventStream.Publish(new AuditLog(GuidFactory.Create().ToString(), DateTime.UtcNow, "me", "0000", "debit3", "mobile"));
ExpectMsg<Acknowleged>(x=> x.Property == "debit3");
or even:
actorSystem.EventStream.Publish(new AuditLog(GuidFactory.Create().ToString(), DateTime.UtcNow, "me", "0000", "debit1", "mobile"));
actorSystem.EventStream.Publish(new AuditLog(GuidFactory.Create().ToString(), DateTime.UtcNow, "me", "0000", "debit2", "mobile"));
actorSystem.EventStream.Publish(new AuditLog(GuidFactory.Create().ToString(), DateTime.UtcNow, "me", "0000", "debit3", "mobile"));
ExpectMsg<Acknowleged>(x=> x.Property == "debit1");
ExpectMsg<Acknowleged>(x=> x.Property == "debit2");
ExpectMsg<Acknowleged>(x=> x.Property == "debit3");
Garrard Kitchen
@garrardkitchen
Hi @Aaronontheweb, I took a punt at upgrading projects to 1.1.1 but experiencing same error with mono. Works fine on windows but not on the mac and here comes a bigger BUT….but, I’ve just realised I'm not actually comparing apples with apples here and I’m sure this will be relevant!…In win env I’m using .net but it’s only the mac I’m using mono.
Maxim Cherednik
@maxcherednik
Hi @Aaronontheweb, while Akka.Cluster was in beta the process of graceful node shutdown was a bit verbose and there were some error messages with socket exceptions and so on. That time you were saying that you guys will handle this and remove unnecessary exception logging. So at the moment I am trying the same thing - graceful node shutdown and I see some exceptions with error level ERROR - is this ok or it wasn't fixed? Even though cluster works fine. It's just those messages which makes me worried.
Samurai Ken
@themdrnsamurai

Hey all. I am exploring this "actors" thing, and had a question... in lookgin at Orleans and Akka, I want to make sure I am not fundementally makign a conceptual error. I am working on expanding the scalability and maintainability of a social application. There is already a DocumentDB record for each user with a class / object overlay that provides some linited interfaces to interact with it, a manager to instantiate it and so on.

Obviously, we have re-implemented (badly) somethign that others have done better :)

So does it make sense to put an Actor as a sort of smart cache / internaction model but still have the authoritative data for a user live in the documentDB rather than exist soley in the Actors persistent state? Or is that sort of half comitting to this.

Arsene T. Gandote
@Tochemey
@Horusiath Thank you. The proposed solution works as expected.
Bartosz Sypytkowski
@Horusiath
@themdrnsamurai it depends on how are you going to access the data inside DocumentDB - if you want to use actors as a form of smart cache, then they should either have a full authority over writing any new data to docdb or have a some sort of scheduled task that will trigger the state refresh within some time intervals.
Samurai Ken
@themdrnsamurai

@Horusiath - thanks, yeah, it sems pretty clear ideally the actor should be the sole interface to the underlying DB record. And that is with me. I just wont be able to seel converting our date purely to live within the actor state persistence store but I can se;; this.

The idea is that if, in the future, we need to interface with the data in some other way or move to another technology the data is not deeply tied to the actor implementation chosen.

Bartosz Sypytkowski
@Horusiath
you could create your own "record" object, and just bind its methods to akka actor receiviers
so actor will work as a shell around your "record" - it's pretty limiting the possibilities of particular actor model, but it's the most framework agnostic approach
Arsene T. Gandote
@Tochemey
Hello how do I define an Actor state that will be available during the lifetime of the actor.
Samurai Ken
@themdrnsamurai
@Horusiath I hear you on that being limiting, I am sort of hoping to avoid that (having the DocumentDB record actually act as the store for the Actor directly) it just seems liek that shoudl be wrong somehow :)
Bart de Boer
@boekabart
@Tochemey please elaborate
Bartosz Sypytkowski
@Horusiath
@Tochemey actor's fields and properties is what we call actor state
Arsene T. Gandote
@Tochemey

This is the code:

public class ModulesActor : ReceiveActor
    {
        private Dictionary<string, Tuple<Props, ModuleState>> _moduleRecipes;

        public ModulesActor()
        {
            Ready();
        }

        public override void AroundPreStart()
        {
            _moduleRecipes = new Dictionary<string, Tuple<Props, ModuleState>>();
        }

        public override void AroundPostStop()
        {
            _moduleRecipes = null;
        }

        protected void Ready()
        {
            Receive<LoadModules>(modules => Load());
            Receive<ModulesLoaded>(c =>
            {
                _moduleRecipes = c.Modules;
            });

            Receive<GetModuleMeta>(whois =>
            {
                Sender.Tell(GetModuleMeta(whois.ModuleName));
            });

            Receive<CheckModuleState>(state =>
            {
                Sender.Tell(GetModuleState(state.ModuleName));
            });
        }

        private ModuleState GetModuleState(string moduleName)
        {
            if (!_moduleRecipes.ContainsKey(moduleName))
                return ModuleState.NOT_IMPLEMENTED;
            return _moduleRecipes[moduleName].Item2;
        }

        protected override SupervisorStrategy SupervisorStrategy()
        {
            return new OneForOneStrategy(1,
                // maxNumberOfRetries
                TimeSpan.FromSeconds(30),
                // withinTimeRange

                exception => // localOnlyDecider
                {
                    //Error that we cannot recover from, stop the failing actor
                    if (exception is NotSupportedException) return Directive.Stop;

                    // Error related to configuration setting
                    if (exception is ConfigurationErrorsException) {
                        return Directive.Escalate;
                    }

                    //In all other cases, just stop the failing actor
                    return Directive.Stop;
                });
        }

        private ModuleMeta GetModuleMeta(string moduleName)
        {
            if (!_moduleRecipes.ContainsKey(moduleName)) return null;
            var moduleMeta = new ModuleMeta(_moduleRecipes[moduleName].Item1,
                _moduleRecipes[moduleName].Item2);
            return moduleMeta;
        }

        private static void Load()
        {
            var loader = Context.ActorOf(Props.Create(() => new ModulesLoadingActor()));
            loader.Forward(new LoadModules());
        }
    }

This is the test I am running:

        public void ModulesLoaderActorShouldReturnALoadedModule()
        {
            ActorSystemRefs.ActorSystem = Sys;
            var actorSystem = ActorSystemRefs.ActorSystem;
            var moduleManager = actorSystem.ActorOf(Props.Create(() => new ModulesActor()));
            moduleManager.Tell(new LoadModules());
            var result = ExpectMsg<ModulesLoaded>();
            Assert.NotNull(result);

            moduleManager.Tell(new CheckModuleState("mtn-gh"));
            var moduleMeta = ExpectMsg<ModuleMeta>();
            Assert.NotNull(moduleMeta);
            Assert.True(moduleMeta.State == ModuleState.ONLINE);
        }

The issue I am facing is that the moduleMeta.State does not return the expected value. The first assertion works smoothly.

Bart de Boer
@boekabart
Your manager never gets ModulesLoaded, is I think your root casue
because you forward the LoadModules, the response goes directly to the external requester. in this case, TestActor
Arsene T. Gandote
@Tochemey
@boekabart Any solution?
Bart de Boer
@boekabart
Tell instead of forward.
(note that your 'outer' actor won't get confirmation directly anymore)
Arsene T. Gandote
@Tochemey
@boekabart The reason I used forward is that I do not want to pass the SenderRef into the message.
@boekabart and the Ask-PipeTo is not too recommended in Actors.
Bart de Boer
@boekabart
yes, but you do want to the loader to respond to the manager, right?
Arsene T. Gandote
@Tochemey
@boekabart Yes
Bart de Boer
@boekabart
separate your 'outer contract' from your 'inner contract'
Arsene T. Gandote
@Tochemey
@boekabart How?
Bartosz Sypytkowski
@Horusiath
@Tochemey if ModulesLoaded is addresses specifically to manager, you don't need to check for it using ExpectMsg
Arsene T. Gandote
@Tochemey
Ok
However It still did not work
Bart de Boer
@boekabart
@Tochemey try drawing a sequence diagram with 'outside requester', 'manager' and 'loader' as actors
Bartosz Sypytkowski
@Horusiath
@Tochemey you either can use Ask (which is not recommended, because it's slow) or change behavior after LoadModules call
Bart de Boer
@boekabart
Ask won't work, because the manager has to update its state in the continuation (recipes)
Bartosz Sypytkowski
@Horusiath
I'll send an example in a sec
@boekabart I was talking about using Ask inside ReceiveAsync
Arsene T. Gandote
@Tochemey
@Horusiath So please how do I then proceed with the test code because even the code change I am now getting ModuleLoaded message instead of the expected result: This the new test code:
            ActorSystemRefs.ActorSystem = Sys;
            var actorSystem = ActorSystemRefs.ActorSystem;
            var moduleManager = actorSystem.ActorOf(Props.Create(() => new ModulesActor()));
            moduleManager.Tell(new LoadModules());
            moduleManager.Tell(new CheckModuleState("mtn-gh"));
            var moduleMeta = ExpectMsg<ModuleMeta>();
            Assert.NotNull(moduleMeta);
            Assert.True(moduleMeta.State == ModuleState.ONLINE);