如何使用jms接收器应用Observer Pattern

时间:2015-11-07 06:48:01

标签: java jms rabbitmq observer-pattern

我有一个接收消息的java应用程序(使用RabbitMQ)。但我不知道如何将观察者模式应用于此。 传入消息包含位置String和事件String。

申请结构:

  • 适配器

    • MovementAPI - >用于处理来自RabbitMQ的传入消息的类
    • 控制器 - >具体观察员?
    • 消息
    • (i)观察员
    • (i)主题

我希望这是足够的信息。

1 个答案:

答案 0 :(得分:1)

观察者模式的基础是说你将有一个主题,它将被广播到哪个注册对象(谁是观察者)将被通知

- 制作一个以下的界面,这个界面将由您的观察员进行补充。

public interface Observer {
void update(String incident, String position);
}

创建另一个接口,该接口将由主题实现,必须广播消息

 public interface Subject {

    void registerObserver(Observer observer);

    void removeObserver(Observer observer);

    void notifyObservers();
}

让你的类修改了谁的对象将通知其他观察者对象

public class YourBroadCastObjectData implements Subject {

private ArrayList<Observer> observers;
private String incident;
private String position;

public YourBroadCastObjectData() {
    // TODO Auto-generated constructor stub
    observers = new ArrayList<>();
}

@Override
public void notifyObservers() {
    // TODO Auto-generated method stub
    for (int i = 0; i < observers.size(); i++) {
        Observer observer = observers.get(i);
        observer.update(this.incident, this.position);
    }
}

@Override
public void registerObserver(Observer observer) {
    // TODO Auto-generated method stub
    observers.add(observer);

}

@Override
public void removeObserver(Observer observer) {
    // TODO Auto-generated method stub
    int i = observers.lastIndexOf(observer);
    if (i >= 0) {
        observers.remove(i);
    }

}

public void dataChanged() {
    notifyObservers();
}

public void setData(String incident, String position) {
    this.incident= incident;
    this.position= position;
    dataChanged();
}

public float getIncident() {
    return incident;
}

public float getPosition() {
    return position;
}



}

据我所知,你将有一个异步线程将RabbitMQ服务中的数据提供给你的应用程序,在该线程中你的主题会通知所有对象。

您必须为您的类实现观察者界面,您希望将其作为观察者。在线查看一些示例,了解观察者模式的工作原理。

Java提供了对观察者模式的内置支持,但它是您必须继承的具体类。

为了提供更灵活的设计,您可以根据需要更好地制作自己的图案。

上面的代码将帮助您推送数据(示例..事件和位置),但您也可以制作拉模式

正如您将实现RabbitMQ一样,您必须拥有一些在服务器上不断更新的数据,并且您的消费者代码将连接到服务器上的RabbitMQ服务的生产者。

一旦从消费者代码中获取数据,您就可以将任何类作为主题(YorBroadCastObjectData)来实现SUbject,并且此对象将数据发送到观察者对象。 同时使观察者对象提供对象的对象的引用,即你的观察者对象可以自己注册它作为主体对象的观察者