2016-09-05 3 views
0

AbstractEntryProcessorを拡張してマップエントリを更新するカスタムエントリプロセッサを作成しました。 私のアプリは、私は次の例外を受け取り、2つのインスタンス上でクラスタ内で実行されている、およびエントリープロセッサが実行されます。私のentitesシリアライズについてHazelcast、HazelcastSerializationException: 'com.hazelcast.spi.impl.operationservice.impl.operations.Backup'をシリアル化できませんでした

public class HRUpdateRacesWithEntriesProcessor extends AbstractEntryProcessor<HRMeeting.HRMeetingKey, HRMeeting> { 

    private List<HRRace> races; 
    private Date date; 

    public HRUpdateRacesWithEntriesProcessor(List<HRRace> races, Date date) { 
    this.races = races; 
    this.date = date; 
    } 

    @Override 
    public Object process(Map.Entry<HRMeeting.HRMeetingKey, HRMeeting> entry) { 
    HRMeeting meeting = entry.getValue(); 
    races.stream() 
     .filter(race -> entry.getKey().equals(new HRMeeting.HRMeetingKey(race.getMeetingDate(), race.getCourseId()))) 
     .forEach(newRace -> { 
      Optional<HRRace> matchedRace = 
       meeting.getRaces().stream().filter(origin -> origin.getKey().equals(newRace.getKey())).findFirst(); 
      if (newRace.getEntries() != null && matchedRace.isPresent()) { 
      newRace.setUpdateDate(date); 
      newRace.getEntries().stream() 
       .filter(hrEntry -> matchedRace.get().getEntries().stream().map(el -> el.getKey()) 
        .collect(Collectors.toList()).contains(hrEntry.getKey())) 
       .forEach(hrEntry -> hrEntry.setUpdateDate(date)); 
      matchedRace.get().getEntries().retainAll(newRace.getEntries()); 
      newRace.getEntries().addAll(matchedRace.get().getEntries()); 
      } 
      meeting.getRaces() 
       .removeIf(hrRace -> matchedRace.isPresent() && matchedRace.get().getKey().equals(hrRace.getKey())); 
      meeting.getRaces().add(newRace); 
     }); 
    entry.setValue(meeting); 
    return null; 
    } 
} 

com.hazelcast.nio.serialization.HazelcastSerializationException: Failed to serialize 'com.hazelcast.spi.impl.operationservice.impl.operations.Backup' 
     at com.hazelcast.internal.serialization.impl.SerializationUtil.handleSerializeException(SerializationUtil.java:73) 
     at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toBytes(AbstractSerializationService.java:143) 
     at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toBytes(AbstractSerializationService.java:124) 
     at com.hazelcast.spi.impl.operationservice.impl.OperationServiceImpl.send(OperationServiceImpl.java:406) 
     at com.hazelcast.spi.impl.operationservice.impl.OperationBackupHandler.sendSingleBackup(OperationBackupHandler.java:187) 
     at com.hazelcast.spi.impl.operationservice.impl.OperationBackupHandler.makeBackups(OperationBackupHandler.java:159) 
     at com.hazelcast.spi.impl.operationservice.impl.OperationBackupHandler.backup(OperationBackupHandler.java:78) 
     at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.sendBackup(OperationRunnerImpl.java:270) 
     at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.handleResponse(OperationRunnerImpl.java:253) 
     at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:182) 
     at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:122) 
     at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.run(OperationThread.java:102) 
Caused by: com.hazelcast.nio.serialization.HazelcastSerializationException: Failed to serialize 'com.hazelcast.map.impl.operation.PartitionWideEntryWithPredicateBackupOperation' 
     at com.hazelcast.internal.serialization.impl.SerializationUtil.handleSerializeException(SerializationUtil.java:73) 
     at com.hazelcast.internal.serialization.impl.AbstractSerializationService.writeObject(AbstractSerializationService.java:201) 
     at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataOutput.writeObject(ByteArrayObjectDataOutput.java:371) 
     at com.hazelcast.spi.impl.operationservice.impl.operations.Backup.writeInternal(Backup.java:222) 
     at com.hazelcast.spi.Operation.writeData(Operation.java:472) 
     at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.write(DataSerializableSerializer.java:161) 
     at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.write(DataSerializableSerializer.java:52) 
     at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.write(StreamSerializerAdapter.java:41) 
     at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toBytes(AbstractSerializationService.java:140) 
     ... 10 common frames omitted 
Caused by: com.hazelcast.nio.serialization.HazelcastSerializationException: Failed to serialize 'com.hazelcast.map.AbstractEntryProcessor$EntryBackupProcessorImpl' 
     at com.hazelcast.internal.serialization.impl.SerializationUtil.handleSerializeException(SerializationUtil.java:73) 
     at com.hazelcast.internal.serialization.impl.AbstractSerializationService.writeObject(AbstractSerializationService.java:201) 
     at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataOutput.writeObject(ByteArrayObjectDataOutput.java:371) 
     at com.hazelcast.map.impl.operation.PartitionWideEntryBackupOperation.writeInternal(PartitionWideEntryBackupOperation.java:98) 
     at com.hazelcast.map.impl.operation.PartitionWideEntryWithPredicateBackupOperation.writeInternal(PartitionWideEntryWithPredicateBackupOperation.java:51) 
     at com.hazelcast.spi.Operation.writeData(Operation.java:472) 
     at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.write(DataSerializableSerializer.java:161) 
     at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.write(DataSerializableSerializer.java:52) 
     at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.write(StreamSerializerAdapter.java:41) 
     at com.hazelcast.internal.serialization.impl.AbstractSerializationService.writeObject(AbstractSerializationService.java:199) 
     ... 17 common frames omitted 
Caused by: java.util.ConcurrentModificationException: null 
     at java.util.ArrayList.writeObject(Unknown Source) 
     at sun.reflect.GeneratedMethodAccessor143.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
     at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
     at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
     at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
     at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
     at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
     at java.io.ObjectOutputStream.writeObject(Unknown Source) 
     at java.util.ArrayList.writeObject(Unknown Source) 
     at sun.reflect.GeneratedMethodAccessor143.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
     at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
     at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
     at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
     at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
     at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
     at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
     at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
     at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
     at java.io.ObjectOutputStream.writeObject(Unknown Source) 
     at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.write(JavaDefaultSerializers.java:242) 
     at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.write(StreamSerializerAdapter.java:41) 
     at com.hazelcast.internal.serialization.impl.AbstractSerializationService.writeObject(AbstractSerializationService.java:199) 
     ... 25 common frames omitted 

マイエントリープロセッサは、次のようになりですjava Serializibleを実装しています。それが問題の理由になるのでしょうか?私は

くださいhazelcast-3.8-SNAPSHOT

を使用しています

、私はそれを解決するのに役立ちます。

答えて

0

あなたの問題は、EntryProcessorの実装から何らかの形で(実際にストリームフローに従うことは難しい)コンテンツをキャプチャすることであり、そのためSerializableを使用してシリアル化しようとしていると思います。とにかくDataSerializable/IdentifiedDataSerializableが起きてから(あなたのケースのように)予想外の直列化を防ぐためにjava.util.Serializableではありません:)

私の推測では、日付です:

.forEach(hrEntry -> hrEntry.setUpdateDate(date));

私はこれが役に立てば幸い、あなたは実際にキャプチャされた値を探す必要があります。

+0

私はこのコード '.forEach(hrEntry - > hrEntry.setUpdateDate(date));'をコメントしましたが、それでも同じです。 –

+0

シリアライズには 'IdentifiedDataSerializable'を使用します。私のエンティティは複雑なオブジェクトで、それは他のoncesから構成されています。だから私のエンティティは 'DataSerializableFactory'を実装する必要がありますか?そして、 'DataSerializableFactory'の実装を各エンティティごとに分離する必要がありますか? –

+0

これはあなたの実際の問題を解決することはできません、あなたはまだあまりにも多くシリアル化するつもりです。私は実際の問題を回避することをお勧めします。それは多くのトラフィックを節約します。 - そうでなければ、シリアル化のための工場と実装 - 起動時に登録する – noctarius

1

簡単な問題かもしれません。 HazelcastでIMapにオブジェクトを配置しようとしたときに同じエラーが発生しました。私の場合、私が入れようとしているオブジェクトはSerializableを実装していませんでした。

だから、私はあなたが

のように "com.hazelcast.spi.impl.operationservice.impl.operations.Backup" でSerializableを実装しました確認すべきだと思う

パブリッククラスのバックアップはSerializable { ... }を実装します

0

Serializableクラスを投稿できますか?間違ったserialVersionUIDがあったときにこのエラーが発生したためです。あなたはserialVersionUIDを持っていますか?それは定数ですか(すべてのデプロイメントで同じですか?)

関連する問題