0

現在 Hazelcast 3.0 を使用しており、異なるメッセージ オブジェクトで異なるトピックをセットアップしようとしています。複数のトピックをリッスンできるクラスが必要ですが、onMessage() メソッドが異なるため、それがどのように可能かわかりません。同じ消去。これが私の Hazelcast 構成クラスです。

import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.ITopic;
import com.hazelcast.core.MessageListener;

public class HazelcastHelper {

  //List of Topics
  public static final String TIMER = "TIMER";
  public static final String POINTS = "POINTS";

  public static class TimerMO {}
  public static class PointsMO {}

  private HazelcastInstance hz = null;

  public HazelcastInstance getHazelcastInstance() {
    if (hz == null) {
        hz = Hazelcast.newHazelcastInstance();
        ...
    }
    return hz;
  }

  public ITopic<TimerMO> getTimerTopic() {
    return this.getHazelcastInstance().getTopic(TIMER);
  }

  public void publishTimer(TimerMO message) {
    this.getTimerTopic().publish(message);
  }

  public String addTimerListener(MessageListener<TimerMO> messageListener) {
    return this.getTimerTopic().addMessageListener(messageListener);
  }

  public ITopic<PointsMO> getPointsTopic() {
    return this.getHazelcastInstance().getTopic(POINTS);
  }

  public void publishPoints(PointsMO message) {
    this.getPointsTopic().publish(message);
  }

  public String addPointsListener(MessageListener<PointsMO> messageListener) {
    return this.getPointsTopic().addMessageListener(messageListener);
  }
}

次に、たとえば、メッセージ オブジェクトの 1 つに基づいてトピックをリッスンするスーパークラスがあります。

import com.hazelcast.core.Message;
import com.hazelcast.core.MessageListener;

public class TimerListener implements MessageListener<HazelcastHelper.TimerMO> {
  @Override
  public void onMessage(Message<HazelcastHelper.TimerMO> message) {
    ...
  }
}

次に、2 番目のタイプのメッセージ オブジェクトをリッスンするサブクラス:

import com.hazelcast.core.Message;
import com.hazelcast.core.MessageListener;

public class PointsListener extends TimerListener implements MessageListener<HazelcastHelper.PointsMO> {
  @Override
  public void onMessage(Message<HazelcastHelper.PointsMO> message) {
    ...
  }
}

しかし、ご覧のとおり、これは許可されていません。これは、両方とも MessageListener を実装しているスーパークラスとサブクラスの間に消去の競合があるためですが、異なるタイプの MessageObject クラスに対してです。また、両方のタイプのメッセージをリッスンする 1 つのクラスが必要な場合もあることに注意してください。これは、消去の競合のためにも機能します。

何か不足していますか?これは、Hazelcast を使用してトピックとリスナーを作成するための通常のシナリオではありませんか? 実装をクリーンに保ち、メッセージをイントロスペクトしてメッセージのタイプを評価する必要がないようにしたいと思います。Hazelcast はクリーンなデザインを作成していないように思えますが、トピック、メッセージ、およびリスナーの設定方法が不足している可能性があります。正しく。これを解決する方法を理解するのを手伝ってください。

4

0 に答える 0