小编eir*_*lar的帖子

如何在Akka FSM过渡期间访问状态

我正在使用Akka FSM处理我的Actor中的状态.我希望每次转换到某个状态时都会执行一些操作,无论转换是从哪个状态进行的.阅读完文档后,我确信这可以解决这个问题:

onTransition({
  case (_, ToState) => performAction(stateData)
})

...

when(FromState){
  case "changestate" => goto(ToState) using NewStateData
}
Run Code Online (Sandbox Code Playgroud)

但是,发生转换时,stateData尚未更新为NewStateData.

进入特定状态时执行操作的推荐方法是什么?

transition scala state-machine fsm akka

10
推荐指数
1
解决办法
1862
查看次数

使用Argonaut或Circe更新不完整JSON的案例类

我需要从一个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)

json scala shapeless argonaut circe

10
推荐指数
1
解决办法
1480
查看次数

Java byte []到/从String转换

为什么这个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字符占用两个字节,结果数组在内容和长度上都与传入数组不同.

请赐教.

java string byte bytearray utf-8

5
推荐指数
1
解决办法
1164
查看次数

Akka Remoting是否支持单向连接?

我有一个在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进行通话时,这种方法也适用.

现在我正在仔细研究连接丢失和重新连接.我一直关注的场景是这样的:

  • Android设备和服务器都在wlan上.
  • Android设备向服务器发送消息.
  • Akka远程安卓产生RemoteClientStarted.
  • Akka远程服务器生成RemoteClientStartedRemoteServerClientConnected.
  • 然后我在Android上关闭wlan,等待几秒钟然后再打开它.没有尝试在其间发送到服务器的消息.
  • Android上的Akka远程产生RemoteClientShutdownRemoteClientError(ETIMEDOUT)
  • 服务器上的Akka远程处理没有说什么.
  • Android向服务器发送消息.
  • 服务器生成RemoteServerClientConnected并接收消息.
  • 服务器尝试发送消息(称为对下面的问题)到Android,并产生:RemoteServerError,RemoteServerClientDisconnected,RemoteClientShutdown,RemoteServerClientClosed.
  • Android永远不会从服务器获取消息.
  • 服务器尝试发送另一条消息,但Akkas RemoteClient说:
    • [PassiveRemoteClient @ akka://xxx@0.0.0.0:8000]已关闭
    • 启动远程客户端连接到[akka://xxx@0.0.0.0:8000 | /0.0.0.0]
    • RemoteClientError @ akka://vts@0.0.0.0:8000:错误[...

最后一个错误似乎来自于Akka Remote想要创建一个新的ActiveRemoteClient而不是重用现有的PassiveRemoteClient.我想这再次来自于服务器在看到错误/断开连接/关闭/ clientcloseds之前观察RemoteServerClientConnected事件.

现在的问题是:

  1. PassiveRemoteClient在这种情况下,如何在发送消息A时让服务器重用Android设备上的最后一个传入连接()?
  2. 如何指示服务器不要尝试连接回客户端?

版本:

  • Android:15(4.0.3)
  • 阿卡:2.1
  • Java:1.6 64位
  • 斯卡拉:2.10.1
  • Netty:3.5.8

networking android client-server akka netty

2
推荐指数
1
解决办法
834
查看次数

jodatime期间的错误?

为什么我写的这个测试在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小时.这是违反直觉的.

java period jodatime

1
推荐指数
1
解决办法
728
查看次数