2016-08-24 2 views
2

Я устанавливаю кластер akka (используя библиотеку akka version 2.3.9) с одним мастером-актером и несколькими работниками-актерами. Мастер-актер настроен с маршрутизатором, поддерживающим кластер пула.AKKA (V2.3.9) Интеграция с весной :: Отключение кластера с удаленными маршрутизаторами из-за ошибки серийной сортировки Spring

Развертывание приложения с формированием 4 узлов кластера. Первоначально все узлы соединяются в кластер правильно, но через несколько минут узлы диссоциируют кластер и формируют собственный кластер.

**Getting below warn message logged when enabling remote debug logging -** 

**ERROR] []** [ClusterSystem-akka.remote.default-remote-dispatcher-23] [akka.tcp://ClusterSystem 
@localhost:2551/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FClusterSystem%40localhost%3A2552-0/en 
dpointWriter] AssociationError [akka.tcp://[email protected]:2551] -> [akka.tcp://[email protected]:2552 
]: **Error [Failed to write message to the transport] [ 
akka.remote.EndpointException: Failed to write message to the transport 
Caused by: java.lang.IllegalArgumentException: Can't serialize object of type class org.springframework.context.supp 
ort.ClassPathXmlApplicationContext** 
    at akka.cluster.protobuf.ClusterMessageSerializer.toBinary(ClusterMessageSerializer.scala:74) 
    at akka.serialization.Serialization$$anonfun$serialize$1.apply(Serialization.scala:90) 
    at akka.serialization.Serialization$$anonfun$serialize$1.apply(Serialization.scala:90) 
    at scala.util.Try$.apply(Try.scala:161) 
    at akka.serialization.Serialization.serialize(Serialization.scala:90) 
    at akka.remote.serialization.DaemonMsgCreateSerializer.serialize(DaemonMsgCreateSerializer.scala:107) 
    at akka.remote.serialization.DaemonMsgCreateSerializer$$anonfun$propsProto$1$1.apply(DaemonMsgCreateSerializ 
er.scala:56) 
    at akka.remote.serialization.DaemonMsgCreateSerializer$$anonfun$propsProto$1$1.apply(DaemonMsgCreateSerializ 
er.scala:56) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) 
    at scala.collection.AbstractTraversable.map(Traversable.scala:105) 
    at akka.remote.serialization.DaemonMsgCreateSerializer.propsProto$1(DaemonMsgCreateSerializer.scala:56) 
    at akka.remote.serialization.DaemonMsgCreateSerializer.toBinary(DaemonMsgCreateSerializer.scala:62) 
    at akka.remote.MessageSerializer$.serialize(MessageSerializer.scala:36) 
    at akka.remote.EndpointWriter$$anonfun$serializeMessage$1.apply(Endpoint.scala:842) 
    at akka.remote.EndpointWriter$$anonfun$serializeMessage$1.apply(Endpoint.scala:842) 
    at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57) 
    at akka.remote.EndpointWriter.serializeMessage(Endpoint.scala:841) 
    at akka.remote.EndpointWriter.writeSend(Endpoint.scala:742) 
    at akka.remote.EndpointWriter$$anonfun$2.applyOrElse(Endpoint.scala:717) 
    at akka.actor.Actor$class.aroundReceive(Actor.scala:465) 
    at akka.remote.EndpointActor.aroundReceive(Endpoint.scala:410) 
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) 
    at akka.actor.ActorCell.invoke(ActorCell.scala:487) 
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:254) 
    at akka.dispatch.Mailbox.run(Mailbox.scala:221) 
    at akka.dispatch.Mailbox.exec(Mailbox.scala:231) 
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.pollAndExecAll(ForkJoinPool.java:1253) 
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1346) 
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 
+0

Не уверен, чего вы пытаетесь достичь, но это действительно звучит странно, чтобы сериализовать весь класс ClassPathXmlApplicationContext ... –

ответ

1

Я столкнулся с той же проблемой в своем приложении java-spring-akka. Я использую IndirectActorProducer для создания экземпляров в качестве компонента (с прототипом области). Этот производитель содержит Spring ApplicationContext. Такой способ отлично работает с кластером. Но простой объединенный маршрутизатор в кластерной среде (круговой пул в моем случае) пытается отправить реквизит с IndirectActorProducer (и с помощью ApplicationContext) через кластер. Я могу предложить обходное решение хака, которое работает для меня: создайте собственный сериализатор и определите его в классе «ConfigurableApplicationContext». Смотрите пример ниже:

public class SpringContextSerializer extends JSerializer { 
private static ConfigurableApplicationContext configurableApplicationContext; 

public static void init(ConfigurableApplicationContext configurableApplicationContext) { 
    SpringContextSerializer.configurableApplicationContext = configurableApplicationContext; 
} 

public SpringContextSerializer() { 
    if (configurableApplicationContext == null) { 
     throw new RuntimeException("Serializer mist be initialized before creating."); 
    } 
} 

@Override 
public int identifier() { 
    return getClass().toString().hashCode(); 
} 

@Override 
public byte[] toBinary(Object o) { 
    return new byte[0]; 
} 

@Override 
public boolean includeManifest() { 
    return false; 
} 

@Override 
public Object fromBinaryJava(byte[] bytes, Class<?> manifest) { 
    return configurableApplicationContext; 
} 
} 

Config:

akka.actor { 
serializers { 
    context = "ru.ddg.elleps.hubcache.integration.SpringContextSerializer" 
} 

serialization-bindings { 
    "org.springframework.context.annotation.AnnotationConfigApplicationContext" = context 
} 
} 

Кроме того, вы должны инициализировать сериалайзер с контейнером Befor запустится ActorSystem.

+0

действительно хороший ответ, решил мою проблему, я не знаю, почему только удаленное развертывание имеет проблема –

Смежные вопросы