ملاحظات حول تسلسل نوع الجهات الفاعلة الموثوقة لـService Fabric

يجب أن تكون وسيطات جميع الأساليب وأنواع نتائج المهام التي يتم إرجاعها بواسطة كل طريقة في واجهة ممثل والكائنات المخزنة في مدير حالة المستخدم قابلة للتسلسل في عقد البيانات. ينطبق هذا أيضًا على حجج الأساليب المحددة في واجهات أحداث الممثل. (تعود أساليب واجهة حدث الممثل دائمًا إلى الفراغ.)

أنواع البيانات المخصصة

في هذا المثال، تحدد واجهة الممثل التالية طريقة ترجع نوع بيانات مخصص يسمى VoicemailBox:

public interface IVoiceMailBoxActor : IActor
{
    Task<VoicemailBox> GetMailBoxAsync();
}
public interface VoiceMailBoxActor extends Actor
{
    CompletableFuture<VoicemailBox> getMailBoxAsync();
}

يتم تنفيذ الواجهة بواسطة ممثل يستخدم مدير الحالة لتخزين كائن VoicemailBox:

[StatePersistence(StatePersistence.Persisted)]
public class VoiceMailBoxActor : Actor, IVoicemailBoxActor
{
    public VoiceMailBoxActor(ActorService actorService, ActorId actorId)
        : base(actorService, actorId)
    {
    }

    public Task<VoicemailBox> GetMailboxAsync()
    {
        return this.StateManager.GetStateAsync<VoicemailBox>("Mailbox");
    }
}

@StatePersistenceAttribute(statePersistence = StatePersistence.Persisted)
public class VoiceMailBoxActorImpl extends FabricActor implements VoicemailBoxActor
{
    public VoiceMailBoxActorImpl(ActorService actorService, ActorId actorId)
    {
         super(actorService, actorId);
    }

    public CompletableFuture<VoicemailBox> getMailBoxAsync()
    {
         return this.stateManager().getStateAsync("Mailbox");
    }
}

في هذا المثال، يتم تسلسل الكائن VoicemailBox عندما:

  • يتم نقل الكائن بين مثيل ممثل ومتصل.
  • يتم حفظ الكائن في مدير الحالة حيث يتم استمراره على القرص ونسخه إلى عقد أخرى.

يستخدم إطار عمل الممثل الموثوق به تسلسل DataContract. لذلك، يجب إضافة تعليقات توضيحية إلى كائنات البيانات المخصصة وأعضائها باستخدام سمات DataContractوDataMember على التوالي.

[DataContract]
public class Voicemail
{
    [DataMember]
    public Guid Id { get; set; }

    [DataMember]
    public string Message { get; set; }

    [DataMember]
    public DateTime ReceivedAt { get; set; }
}
public class Voicemail implements Serializable
{
    private static final long serialVersionUID = 42L;

    private UUID id;                    //getUUID() and setUUID()

    private String message;             //getMessage() and setMessage()

    private GregorianCalendar receivedAt; //getReceivedAt() and setReceivedAt()
}
[DataContract]
public class VoicemailBox
{
    public VoicemailBox()
    {
        this.MessageList = new List<Voicemail>();
    }

    [DataMember]
    public List<Voicemail> MessageList { get; set; }

    [DataMember]
    public string Greeting { get; set; }
}
public class VoicemailBox implements Serializable
{
    static final long serialVersionUID = 42L;
    
    public VoicemailBox()
    {
        this.messageList = new ArrayList<Voicemail>();
    }

    private List<Voicemail> messageList;   //getMessageList() and setMessageList()

    private String greeting;               //getGreeting() and setGreeting()
}

الخطوات التالية