队列模式,我们将domain视为一个队列,domain中的每个节点看做一个队列消息,通过检查domain的变化来获取队列消息。
消息发送代码:
import com.fourinone.*; import java.io.Serializable; public class Sender { public static void send(String queue,Object obj) { ParkLocal pl=BeanContext.getPark(); pl.create(queue,(Serializable)(obj)); //每个节点就是一个消息 } public static void main(String [] args) { send("queue1","hello"); send("queue1","world"); send("queue1","mq"); } }
import com.fourinone.*; import java.util.*; public class Receiver { public static void receive(String queue) { ParkLocal pl=BeanContext.getPark(); List<ObjectBean> oblist=pl.get(queue); while(oblist!=null) { ObjectBean ob=oblist.get(0); System.out.println(ob.toObject()); //消息读取完毕要记得从队列中删除 pl.delete(ob.getDomain(),ob.getNode()); oblist=pl.get(queue); } } public static void main(String [] args) { receive("queue1"); receive("queue1"); } }
下面我们来看下fourinone是如何实现主题订阅模式的:将每个domain看成一个主题,domain的节点看成该主题的订阅者,节点的值存储了给节点收到的信息(链表),发布者将消息发布到某个主题的全部节点,订阅者监控自己的节点的变化来获取消息。
发布者代码:
import com.fourinone.*; import java.util.*; public class Publisher { public static void publish(String subject,Object obj) { ParkLocal pl=BeanContext.getPark(); List<ObjectBean> oblist=pl.get(subject); if(oblist!=null) { for(ObjectBean ob:oblist) { ArrayList arr=(ArrayList)ob.toObject(); arr.add(obj); pl.update(ob.getDomain(),ob.getNode(),arr); } } System.out.println("already published"); } public static void main(String [] args) { publish("topic","helloworld"); } }
订阅者代码:
import com.fourinone.*; import java.util.*; public class Subscriber implements LastestListener { public boolean happenLastest(LastestEvent le) { ObjectBean ob=(ObjectBean)le.getSource(); ArrayList arr=(ArrayList)ob.toObject(); System.out.println("published message:"+arr); ParkLocal pl=BeanContext.getPark(); ObjectBean newob=pl.update(ob.getDomain(),ob.getNode(),new ArrayList()); le.setSource(newob); return false; } public static void subscribe(String subject,String name,LastestListener listener) { ParkLocal pl=BeanContext.getPark(); ObjectBean ob=pl.create(subject,name,new ArrayList()); pl.addLastestListener(subject,name,ob,listener); } public static void main(String [] args) { subscribe("topic",args[0],new Subscriber()); } }