我们知道JMS规范提供了两种经典的消息服务模式:队列模式和主题订阅模式。我们看看fourinone是如何实现着两种模式的。
队列模式,我们将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());
}
}
分享到:
相关推荐
本项目实战教程涵盖了高并发、集群以及分布式系统架构等关键知识点,旨在帮助Java架构师提升技能,实现高性能、高可用和可扩展的电商系统。 1. **Java基础与高级特性** - Java的基础语法、面向对象编程、异常处理...
原来的PDF版有85M,过大。这个是epud版,只有6M,方便阅读和摘抄笔记。
本篇笔记将着重讨论分布式系统的概念、微服务架构的特点、分布式与微服务的关联,以及在Java环境下如何实践这一架构。 首先,分布式系统是由多个通过网络连接协同工作的计算机组成的系统,它们可以跨越多个物理位置...
etcd是一个基于Go语言构建的开源分布式键值存储系统,设计目标是为分布式系统提供强一致性的、高可用的配置共享和服务发现功能。它专注于提供可靠的分布式键值存储,使得在分布式环境中管理和共享关键数据变得简单。...
Go语言以其简洁的语法、高效的内存管理和强大的并发能力,特别适合构建高并发、高性能的分布式系统,如即时通讯系统。 在即时通讯系统中,主要涉及到以下几个关键技术点: 1. **并发处理**:Go语言的goroutine和...
总之,Kubernetes是现代云原生架构的重要组成部分,它提供了强大的容器编排能力,帮助开发者和运维人员更高效地管理大规模分布式应用。通过深入学习和实践提供的资料,你将能够掌握这一关键技术,并在实际工作中发挥...
在IT行业中,数据库管理系统起着至关重要的作用,而Doris是一款高性能、分布式的数据仓库系统,专为在线分析处理(OLAP)设计。本篇将深入探讨Doris实战中的"BE"部分,以及与之相关的依赖包,特别是C++编程语言在...
### Redis 3 分布式集群部署详解 #### 一、Redis 概述 Redis (Remote Dictionary Server) 是一...通过这种方式,不仅可以有效提升 Redis 的性能和可用性,还能满足大规模应用的需求。希望本文能为读者提供参考价值。
标题中的“项目讲义 SaaS平台.rar”表明这是一个关于SaaS(Software as a Service)平台的项目学习资料,其中可能涵盖了构建和管理SaaS...通过深入学习和实践,可以提升在构建大规模分布式系统和SaaS平台方面的技能。
- **分布式系统**:深入理解分布式系统的特性,包括CAP理论、一致性哈希算法等,为解决大规模分布式系统问题提供思路。 ### 面试准备 - **Java架构面试专题汇总**:收集常见的Java架构面试题目及答案,帮助求职者...
Hadoop是一个开源框架,专为分布式存储和处理大规模数据集而设计。这个开发笔记可能深入探讨了Hadoop的核心组件,包括HDFS(Hadoop分布式文件系统)和MapReduce编程模型。 【描述】虽然描述简洁,但我们可以推测这...
【Dubbo入门到精通架构高级课程】是一门深入解析Dubbo框架...通过这个全面的课程,无论你是初涉分布式系统的开发者还是寻求提升的Java工程师,都将能够熟练掌握Dubbo的使用,并具备构建和维护大规模分布式服务的能力。
3. **CentOS Linux系统管理**:涵盖CentOS的日常管理,包括系统启动与关机、用户环境设置、文件系统管理等。 4. **Linux必备命令**:这是Linux操作的核心,学习如cd、ls、mkdir、rm等基本命令,以及管道、重定向等...
5. **读写分离与分库分表**:对于大规模的秒杀系统,可能需要对数据库进行读写分离和水平扩展,通过分库分表策略减轻单库压力。 6. **数据库优化**:使用索引优化查询效率,设计合理的数据模型,减少join操作,避免...
通过这些文件,我们可以学习到构建和优化大规模互联网应用所需的关键技能,包括但不限于项目管理、Web开发框架、数据库设计、分布式缓存、搜索引擎和消息队列等。这些知识对于理解现代互联网架构和提升开发效率至关...
2. MapReduce:并行计算模型,将大规模数据处理任务分解为“映射”(map)和“化简”(reduce)两个阶段,实现数据的分布式处理。 二、Hadoop架构 Hadoop架构包含NameNode、DataNode、JobTracker和TaskTracker等关键...
HDFS提供了一个高容错、高吞吐量的数据存储系统,而MapReduce则是用于处理和生成大规模数据集的编程模型。 二、Hadoop学习笔记之五:使用Eclipse插件 Eclipse插件是开发Hadoop应用的重要工具,它提供了集成的开发...
Linux高级篇进一步提升了学习的深度和广度,涉及到性能优化、大规模数据备份、Shell脚本编程,以及自动化运维工具Puppet、Ansible和Jenkins的实战应用。Shell脚本的掌握能够帮助你编写自动化维护和部署的工具,提升...