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);
  }
}

然后,例如,我有一个超类,它根据消息对象之一侦听主题:

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) {
    ...
  }
}

然后是监听第二种消息对象的子类:

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 类。请注意,我还可能希望有一个类可以监听这两种类型的消息,由于擦除冲突,它也可以工作。

我错过了什么吗?这不是使用 Hazelcast 创建主题和听众的正常场景吗?我想保持我的实现干净,而不必自省 Messages 来评估它们是什么类型——在我看来 Hazelcast 没有创建干净的设计,但也许我错过了如何设置主题、消息和听众正确。请帮助我了解如何解决此问题。

4

0 回答 0