我正在使用Akka FSM处理我的Actor中的状态.我希望每次转换到某个状态时都会执行一些操作,无论转换是从哪个状态进行的.阅读完文档后,我确信这可以解决这个问题:
onTransition({
case (_, ToState) => performAction(stateData)
})
...
when(FromState){
case "changestate" => goto(ToState) using NewStateData
}
Run Code Online (Sandbox Code Playgroud)
但是,发生转换时,stateData尚未更新为NewStateData.
进入特定状态时执行操作的推荐方法是什么?
我需要从一个case类实例创建一个更新的实例(带有任何需要DecodeJson的隐式派生),给定一个不完整的json(缺少一些字段).如何通过Argonaut(最好)或Circe(如果必须的话)实现这一目标?
例:
case class Person(name:String, age:Int)
val person = Person("mr complete", 42)
val incompletePersonJson = """{"name":"mr updated"}"""
val updatedPerson = updateCaseClassFromIncompleteJson(person, incompletePersonJson)
println(updatedPerson)
//yields Person(mr updated, 42)
Run Code Online (Sandbox Code Playgroud)
我很确定我必须将json解析为json AST,然后将其转换为Shapeless LabelledGeneric,然后以某种方式使用Shapeless更新来更新case类实例.
编辑2
在阅读了Shapeless源代码后,我发现我可以生成自己的"默认"对象.我设法创建了一个解决方案,它需要在解析json时出现case类的实例.我希望避免这种情况,而是稍后提供实例.无论如何它是:
import shapeless._
import argonaut._
import ArgonautShapeless._
import shapeless.ops.hlist.Mapper
case class Person(name: String, age: Int)
object MkDefault {
object toSome extends Poly1 {
implicit def default[P] = at[P](Some(_))
}
def apply[P, L <: HList, D <: HList]
(p: P)
(implicit
g: Generic.Aux[P, L],
mpr: Mapper.Aux[toSome.type, L, …Run Code Online (Sandbox Code Playgroud) 为什么这个junit测试失败了?
import org.junit.Assert;
import org.junit.Test;
import java.io.UnsupportedEncodingException;
public class TestBytes {
@Test
public void testBytes() throws UnsupportedEncodingException {
byte[] bytes = new byte[]{0, -121, -80, 116, -62};
String string = new String(bytes, "UTF-8");
byte[] bytes2 = string.getBytes("UTF-8");
System.out.print("bytes2: [");
for (byte b : bytes2) System.out.print(b + ", ");
System.out.print("]\n");
Assert.assertArrayEquals(bytes, bytes2);
}
}
Run Code Online (Sandbox Code Playgroud)
我假设传入的字节数组等于结果,但不知何故,可能是因为UTF-8字符占用两个字节,结果数组在内容和长度上都与传入数组不同.
请赐教.
我有一个在Android设备上运行的Akka系统,它通过Akka Remoting与服务器上的Akka系统通信.
Android设备可能获得任何IP地址,IP可能会在应用程序运行时发生变化,并且IP无法从服务器访问.因此,我在Android设备上使用akka.remote.netty.hostname = "0.0.0.0"和配置了Akka akka.remote.netty.port = 8000.
Android Akka系统获取对服务器上的actor的引用,向其发送消息,服务器上的Actor记录sender()actorRef并继续向其发送消息.当服务器和Android设备位于同一个wlan上,并且当他们通过互联网通过GPRS进行通话时,这种方法也适用.
现在我正在仔细研究连接丢失和重新连接.我一直关注的场景是这样的:
RemoteClientStarted.RemoteClientStarted和RemoteServerClientConnected.RemoteClientShutdown和RemoteClientError(ETIMEDOUT)RemoteServerClientConnected并接收消息.RemoteServerError,RemoteServerClientDisconnected,RemoteClientShutdown,RemoteServerClientClosed.RemoteClient说:
最后一个错误似乎来自于Akka Remote想要创建一个新的ActiveRemoteClient而不是重用现有的PassiveRemoteClient.我想这再次来自于服务器在看到错误/断开连接/关闭/ clientcloseds之前观察RemoteServerClientConnected事件.
现在的问题是:
PassiveRemoteClient在这种情况下,如何在发送消息A时让服务器重用Android设备上的最后一个传入连接()?版本:
为什么我写的这个测试在jodatime 1.6.2中失败了?这是一个错误吗?
@Test
public void testIfJodaTimePeriodsHandlesPeriodTypesOtherThanMinutesAndHours() {
long twentyDaysInMillis = TimeUnit.MILLISECONDS.convert(20, TimeUnit.DAYS);
Period twoWeeks = new Period(twentyDaysInMillis, PeriodType.weeks());
Assert.assertEquals(2, twoWeeks.getWeeks());
// twoWeeks.getWeeks() actually returns 0!!
}
Run Code Online (Sandbox Code Playgroud)
仅供参考,具有所有PeriodTypes的期间仅填写分钟和小时的字段,即使传递给构造函数的millis超过25小时.这是违反直觉的.