首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

向所有服务器成员发送直接消息的方法?Java不一致Api

在分布式系统中,向所有服务器成员发送直接消息通常涉及到消息队列、RPC(远程过程调用)或者直接的TCP/UDP通信。以下是一些常见的方法和技术:

基础概念

  • 消息队列:如Kafka、RabbitMQ等,允许异步通信,解耦发送者和接收者。
  • RPC:如gRPC、Apache Thrift等,允许跨网络调用另一个服务的方法。
  • 直接通信:使用TCP或UDP协议直接发送数据包到目标服务器。

优势

  • 消息队列:高吞吐量、可扩展性、解耦、持久化。
  • RPC:简单易用、强类型检查、高效的序列化机制。
  • 直接通信:低延迟、实时性强。

类型

  • 广播:将消息发送到网络中的所有节点。
  • 组播:将消息发送到一组特定的节点。
  • 单播:将消息发送到单一的节点。

应用场景

  • 系统通知:如系统维护通知、紧急更新等。
  • 实时数据同步:如游戏服务器之间的状态同步。
  • 日志收集:集中收集各个服务器的日志信息。

遇到的问题及解决方法

1. Java不一致API

不同的库和框架可能提供了不同的API来发送消息。例如,Java NIO、Netty、Akka等都提供了不同的方式来处理网络通信。

解决方法

  • 统一封装:创建一个统一的接口层,封装不同通信方式的细节。
  • 依赖管理:确保项目中使用的库版本一致,避免版本冲突。

示例代码

以下是一个简单的Java示例,使用Netty实现一个简单的TCP服务器和客户端,用于发送直接消息。

服务器端代码

代码语言:txt
复制
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class TcpServer {
    private int port;

    public TcpServer(int port) {
        this.port = port;
    }

    public void run() throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ch.pipeline().addLast(new TcpServerHandler());
                 }
             })
             .option(ChannelOption.SO_BACKLOG, 128)
             .childOption(ChannelOption.SO_KEEPALIVE, true);

            ChannelFuture f = b.bind(port).sync();
            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws Exception {
        int port = 8080;
        new TcpServer(port).run();
    }
}

服务器端处理器

代码语言:txt
复制
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class TcpServerHandler extends SimpleChannelInboundHandler<ByteBuf> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
        System.out.println("Received message: " + msg.toString(io.netty.util.CharsetUtil.UTF_8));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}

客户端代码

代码语言:txt
复制
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

public class TcpClient {
    static final String HOST = System.getProperty("host", "127.0.0.1");
    static final int PORT = Integer.parseInt(System.getProperty("port", "8080"));

    public static void main(String[] args) {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
             .channel(NioSocketChannel.class)
             .handler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ch.pipeline().addLast(new TcpClientHandler());
                 }
             });

            ChannelFuture f = b.connect(HOST, PORT).sync();
            ByteBuf msg = Unpooled.copiedBuffer("Hello, Server!", io.netty.util.CharsetUtil.UTF_8);
            f.channel().writeAndFlush(msg);
            f.channel().closeFuture().sync();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            group.shutdownGracefully();
        }
    }
}

客户端处理器

代码语言:txt
复制
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class TcpClientHandler extends SimpleChannelInboundHandler<Void> {

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}

参考链接

通过上述方法和示例代码,你可以实现向所有服务器成员发送直接消息的功能。根据具体需求选择合适的技术和方案。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)

有关Netty的入门文章:1)新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析2)写给初学者:Java高性能NIO框架Netty的学习方法和进阶策略3)史上最通俗Netty框架入门长文:基本介绍...客户端拉消息通过一个本地的旧的序列号来拉取服务器的最新消息;5)为了保证消息必达,在线客户端还增加一个定时器,定时向服务端拉取消息,避免服务端向客户端发送拉取通知的包丢失导致客户端未及时拉取数据。...实现方式:可以通过时间戳或者本地序列号方式来实现缺点:本地时间戳不准确或者本地序列号在意外情况下可能会清0,都会导致发送方的绝对时序不准确群聊:因为发送方多点发送时序不一致,所以通过服务器的单点做序列化...《一个低成本确保IM消息时序的方法探讨》12、消息通知设计12.1概述整体消息推送和拉取的时序图如下:图片12.2消息拉取方式的选择本系统是通过推拉结合来进行服务器端消息的推送和客户端的拉取。...2)查询群G所有的成员,然后去redis中央存储中找在线状态。离线和在线成员分不同的方式处理。3)在线成员:并行发送拉取通知,等待在线成员过来拉取,发送拉取通知包如丢失会有兜底机制。

1.2K40

花了20分钟,给女朋友们写了一个web版群聊程序

在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。...可以说WebSocket的出现,使得浏览器具备了实时双向通信的能力 在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。...这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。...举个例子,直接将用户发送给服务端的话再返回给客户端 // 收到消息调用的方法 @OnMessage public void onMessage(Session session, String message...(); // 收到消息调用的方法,群成员发送消息 @OnMessage public void onMessage(@PathParam("sid") String sid

49320
  • JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来3 —— 本地缓存变身分布式集群缓存,打破本地缓存天花板

    基于RMI组播的方式,Ehcache会向对应地址发送RMI UDP组播包,由于Ehcache对于组播的实现较为简单,所以在一些网络情况较为复杂的场景的支持度不是很完善,方案选择的时候需注意。...JMS消息 JMS消息方案是一种很常用的Ehcache集群方案。JMS是一套JAVA中两个进程之间的异步通信API,定义了消息通讯所必须的一组通用能力接口,比如消息的创建、发送、接收读取等。...JGroups是一个开源的群组通讯工具,可以用来创建一个组,这个组中的成员可以给其他成员发送消息。...JGroups的可靠性体现在下面几个方面: 对所有接收者的消息的无丢失传输(通过丢失消息的重发) 大消息的分割传输和重组 消息的顺序发送和接收 保证原子性,消息要么被所有接收者接收,要么所有接收者都收不到...它在JVM与Java应用之间实现了一个专门处理集群功能的抽象层,以其特有的增量检测、智能定向传送、分布式协作、服务器镜像、分片等技术,允许用户在不改变现有系统代码的情况下实现单机Java应用向集群化应用的无缝迁移

    1.7K70

    理解Raft一致性算法—一篇学术论文总结

    候选人在选举期间使用RequestVote AppendEntry被领导者用来复制日志条目,也用作心跳(检查服务器是否启动的信号—它不包含任何日志条目) 领导者选举 领导者定期向追随者发送心跳...当追随者在等待领导者的心跳超时时,将触发领导者选举。从追随者转换到候选人状态,并增加其任期号。在为自己投票之后,它会向集群中的其他成员并行地发出RequestVotes RPC。...这有三种可能的结果: 候选人从大多数服务器获得选票并成为领导者。然后,它向集群中的其他成员发送心跳消息以建立权限。 如果其他候选人收到AppendEntries RPC,他们检查任期编号。...领导者并行地向所有其他服务器发出AppendEntries rpc请求。领导者重试此操作,直到所有追随者安全地复制了新条目。 当创建条目的领导者将条目复制到大多数服务器时,就会认为该条目已提交。...不幸的是,任何将服务器直接从旧配置切换到新配置的方法都是不安全的。 Raft使用两阶段方法来更改集群成员。首先,它切换到称为joint consensus的中间配置。

    99110

    分布式缓存的选择

    JTA JTA只是Java实现XA事务的一个规范,全称Java事务规范JTA(Java Transaction API) ,我们日常使用的@Transactional。都可以叫JTA事务管理。...假如任何一个参与者向协调者发送了“No”消息,或者等待超时之后,协调者都没有收到参与者的响应,就执行中断事务的操作: 发送中断请求。 协调者向所有参与者发送“Abort”消息。 终断事务。...完成事务提交之后,释放所有锁住的资源。 响应反馈。 参与者提交完事务之后,向协调者发送 Ack 响应。 完成事务。 协调者接收到所有参与者的 Ack 响应之后,完成事务。...事务中断阶段: 发送中断请求。 协调者向所有参与者发送 Abort 请求。 事务回滚。...可靠消息最终一致性 流程 A 系统先发送一个 prepared 消息到 mq,如果这个 prepared 消息发送失败那么就直接取消操作别执行了; 如果这个消息发送成功过了,那么接着执行本地事务,如果成功就告诉

    45920

    面试:第十三章:中高级程序员面试

    HTTP重定向负载均衡: 用户的一项操作需要发起两次HTTP请求,一次向调度服务器发送请求,请求首先被集群调度者截获;调度者根据某种分配策略,选择一台服务器,将选中的服务器的IP地址封装在HTTP响应消息头部的...Location字段中,并将响应消息的状态码设为302,最后将这个响应消息返回给浏览器。...第二次向后端服务器发送请求,当浏览器收到响应消息后,解析Location字段,并向该URL发起请求,然后指定的服务器处理该用户的请求,获取处理结果。 最后将结果返回给用户。...反向代理负载均衡: 请求都首先要经过反向代理服务器,服务器根据用户的请求要么直接将结果返回给用户,要么将请求交给后端服务器处理,再返回给用户。...1、在堆区分配对象需要的内存   分配的内存包括本类和父类的所有实例变量,但不包括任何静态变量 2、对所有实例变量赋默认值   将方法区内对实例变量的定义拷贝一份到堆区,然后赋默认值 3、执行实例初始化代码

    36320

    组播(Multicast)传输

    当组成员不再需要接收组播的时候,就应该停止向成员发送组播,要确定组成员不再需要接收组播,就必须在成员退出时明确通告发送者。要确定组成员,有两种方式:查询和报告。...报告,主机也可以不必等待路由器的查询,可以主动向路由器请求加入某个组,退出时也要向路由器发送退出消息,让路由器停止向其前转组播流量。...参考:http://www.china-ccie.com/ccie/lilun/Multicast/Multicast.html 组播数据包的生存时间 将消息发送到多播组时,该主机和端口的所有预定接收者都将接收到消息...套接字不必成为多播组的成员即可向其发送消息。 多数多播包的TTL比较低: 所有的IP包都有一个“生存时间”(time-to-live),或者叫TTL。...Java文档中这部分参考:http://udn.yyuap.com/doc/jdk6-api-zh/java/net/MulticastSocket.html Java 组播的例子 MulticastSocket

    9.6K10

    关于easyswoole实现websocket聊天室的步骤解析

    tcp连接进行销毁并且可能没有close事件提示,所以我们在websocket中提供了ping的命令,该命令发起后,服务器将响应pong,完成一次通信: ## ping 发送:直接给客户端发送 "ping...B发送消息,服务器向B推送时,该条消息记录初始isRecv为0,只有当B客户端接收到消息,并且向服务器发送已接收命令时,才会置为1: ### 消息接收状态 `{"op":4002,"args":{"msgId...websocket服务时,可通过发起好友未读消息推送的命令,向服务器获得之前的未读消息(网络不稳定断线重连) 当ws连接成功时,可通过该命令获取所有的未读好友消息: `{"op":4001,"args...,所有消息记录,好友消息,群成员消息将缓存到客户端,当用户登录成功时 直接显示之前登录时的所有状态(消息列表,最后一条消息显示等) 当新设备登录时,只获取未读消息列表,其他消息需要点击某个好友/群,才会进行显示...,只需要获得群成员的userId,即可获得当前所有在线成员的fd,进行遍历推送 服务端推送问题 当A客户端在群发送一条消息时,由于群成员可能有很多,如果直接同步推送给所有群成员,会造成A客户端等待响应时间过长的情况

    2.6K10

    Uber 实时推送平台实践:gRPC 推动基础设施的发展

    与网关一起, Fireball 生成推送消息,并在适当的时候发送给用户。“推送消息系统”负责向移动设备发送此消息。 推送消息负载元数据 为进行优化,每个推送消息都有不同的配置。...消息存储 RAMEN 服务器将所有的消息保存在内存中,或者备份在数据库中。如果连接不稳定,服务器可以继续重试发送,直到 TTL 到期。...该系统最多保持 60 万个并发流连接,在高峰期每秒向三种不同类型的应用程序推送超过 7 万条 QPS 推送消息。该系统很快就成为服务器客户端 API 基础设施中最重要的部分。...此外,Node.js worker 是单线程的,它会增加事件循环的滞后程度,从而使成员信息的收敛变得更慢。这会导致拓扑信息不一致,以及消息丢失、超时和出错。...在网络条件日益改善、应用范围日益扩大的新城市里,我们将致力于不断提高向移动设备发送消息的长尾可靠性。为了填补空白,我们已经尝试了新的协议和开发方法。经过检验,以下几点是导致可靠性下降的主要原因。

    75420

    一起玩转微服务(6)——通信协议如何统一

    1. gRPC简介 gRPC是Google发布的基于HTTP 2.0传输层协议承载的高性能开源软件框架,提供了支持多种编程语言的、对网络设备进行配置和纳管的方法。...文件,交换机与服务器建立gRPC通道,通过gRPC协议向服务器发送请求消息; 服务器收到请求消息后,服务器会通过Protocol Buffers解译proto文件,还原出最先定义好格式的数据结构,进行业务处理...; 数据梳理完后,服务器需要使用Protocol Buffers重编译应答数据,通过gRPC协议向交换机发送应答消息; 交换机收到应答消息后,结束本次的gRPC交互。...服务间的通信是通过轻量级的web服务,使用同步的REST API进行通信。...例如,如果一个 PATCH 操作表明一个值应从 A 改为 B,那么它就是幂等的。如果它已启动多次而且值已是 B,则没有任何效果。对 PATCH 操作的支持仍不一致。

    1.7K20

    .NetCore3.1 gRPC 实战

    在 gRPC 中,客户端应用程序可以直接将方法调用到其他计算机上的服务器应用程序上,就像它是本地对象一样,从而更轻松地创建分布式应用程序和服务。...返回所有响应后,服务器的状态详细信息(状态代码和可选状态消息)和可选的尾随metadata将被发回服务器端完成。一旦客户端收到服务器的所有响应,它就会完成全部调用。...例如,服务器可以等到收到所有客户端的消息后再写响应,或者服务器和客户端可以实现“ping-pong”:服务器收到请求,然后发回响应,然后客户端根据响应发送另一个请求,依此类推。...截止日期或超时的指定方式因语言而异-例如,并非所有语言都有默认截止日期,有些语言API根据截止日期(固定时间点)工作,有些语言API根据超时(持续时间)工作。...RPC终端 在gRPC中,客户端和服务器都独立地自行确定调用是否成功,他们的结果可能不一致。这意味着,例如,您可以在服务器端成功完成RPC (“我已经发送了我的所有回复!”)

    1.3K10

    分布式系统中的BASE 和 ACID、幂等性、分布式锁、分布式事务与异步消息处理

    业务处理服务在业务事务提交之后,向实时消息服务确认发送。只有在得到确认发送指令后,实时消息服务才会真正发送。 消息:业务处理服务在业务事务回滚后,向实时消息服务取消发送。...消息发送状态确认系统定期找到未确认发送或者回滚发送的消息,向业务处理服务询问消息状态,业务处理服务根据消息ID或者消息内容确认该消息是否有效。...pipe.sendAccountingVouchetMessage(); } 在上面的情况中,如果业务操作成功,执行的消息发送之前应用发生故障,消息发送不出去,导致消息丢失,将会产生订单系统与会计系统的数据不一致...如果消息系统或者网络异常,也会导致消息发送不出去,也会造成数据不一致。...消息消费:当消息被消费的时候,向实时消息服务发送ACK,然后实时消息服务删除消息。同时调用消息服务子系统修改消息为“被消费”状态。

    1.8K20

    与我一起学习微服务架构设计模式3—微服务架构中的进程间通信

    实现API的服务适配器将包含在旧版本与新版本之间进行转换的逻辑,如API Gateway几乎会使用版本化的API 消息的格式 考虑到以后会扩展到其他语言,我们不应该使用类似java序列化这样跟语言强相关的消息格式...消息发送方通过消息通道向接收方发送消息。消息通道是消息传递基础设施的抽象。调用接收方的消息处理程序适配器来处理消息。它调用接收方业务逻辑实现的接收端端口。...类型: 点对点通道:向正在从通道读取的一个消费者传递消息 发布-订阅通道:将一条消息发给所有订阅的接收方 使用消息机制实现交互方式 足够灵活,支持上面描述的所有交互方式 实现请求/响应和异步请求/响应...跟踪消息并丢弃重复消息: 简单的解决方案是消息接收方使用message id跟踪它已处理的消息并丢弃任何重复项 事务性消息 数据库更新和消息发送都必须在事务中进行,否则系统可能处于不一致状态。...消息相关的类库和框架 直接使用消息代理客户端库的弊端: 客户端库将发布消息的业务逻辑耦合到消息代理API 客户端库是非常底层的,需要常编写重复类似的代码 不支持更高级别的交互 更好的方法是使用更高级别的库或框架

    1.8K10

    最全Kafka核心技术学习笔记

    (3) 最佳实践A:使用带回调通知的方法,发送消息B:Producer端设置相关参数: 设置acks=all,表示所有副本Broker都要接收到该消息,才算提交成功。...(2) 如何监控 使用Kafka自带的命令行工具kafka-consumer-groups脚本 使用Kafka Java Conssumer API编程 使用Kafka自带的JMX监控指标(3) 方法分析...Kafka的追随者副本不对外提供服务的原因: 方便实现Read-your-writes(当使用生产者 API 向 Kafka 成功写入消息后,马上使用消费者 API 去读取刚才生产的消息); 方便实现单调读...F :领导者向协调者发送SyncGroup请求,将刚刚做出的分配方案发给协调者。值得注意的是,其他成员也会向协调者发送SyncGroup请求,只是请求体中并没有实际内容。...要实现DateTime策略:需要借助KafkaConsumer.offsetsForTimes方法。总之:使用Java API的方式来实现重设策略的主要入口方法,就是seek方法。4.

    1.1K10

    首页 归档 分类 标签 作者 kafka原理总结

    , 通常有以下三种模式 Fire-and-forget: 异步发送的一种, 不关心是否失败: producer.send(record); 同步发送: send 方法返回的是一个 future 对象,...(RecordAccumulator可以理解是个集合,集合的元素是个队列,每个队列对应要发送至服务上的分区) 中,send方法即刻返回,也就是说此时并不能确定消息是否真正的发送到 broker 另外一个是...batch.size 满了或达到 linger.ms 就会把消息发送出去 max.block.ms: 当发送缓冲区已满或者元数据不可用时,生产者调用send()和partitionsFor()方法会被阻塞...还提供了更精确的提交 api, 可以实现处理完一批消息后, 提交最后一个 offset 值。...HW 机制定义了消息的可见性, 但是在某些情况下会出现数据丢失/数据不一致的问题。

    43920

    【Netty】「项目实战」(一)如何构建多客户端聊天室

    是一个自定义的 Java 类型,它包含了发送方 from、接收方 to 和消息正文 content 等信息。...发送消息到群聊是指用户可以将消息发送到所在的群聊中,让其他成员看到。查看成员列表是指用户可以查看当前群聊中的所有成员。加入群聊是指用户可以选择加入已有的群聊,开始和其他成员聊天。...收集完这些信息后,我们可以使用自定义类 GroupCreateRequestMessage 创建一个新消息,此消息将包含服务器创建群聊所需的所有信息,包括群组的名称和成员列表。...为了确保每个在线成员都能够及时收到消息,我们需要采用一种广播机制来实现消息的分发。 具体而言,我们可以通过遍历所有的聊天室成员所对应的 channel,将消息发送给每一个在线用户。...当然,这种方式并不是最高效的方法,因为如果有大量的在线用户,这会导致服务器性能下降。 因此,在实际应用中,可能会使用消息队列或者事件通知等更加高效的消息传递机制来实现。

    83330

    消息中间件面试题31道RabbitMQ+ActiveMQ+Kafka

    具体原因不详,解决方案:尽量不要用非持久化消息,非要用的话,将临时文件限制尽可能的调大。 3.丢消息怎么办? 这得从 java 的 java.net.SocketException 异常说起。...当客户端发完消息调用connection.close()时,会期待服务器对于关闭连接的回答,如果超过 15 秒没回答就直接调用 socket 层的 close 关闭 tcp 连接了。...这时客户端发出的消息其实还在服务器的缓存里等待处理,不过由于服务器心跳包的设置,导致发生了 java.net.SocketException 异常,把缓存里的数据作废了,没处理的消息全部丢失。...producer 直接将数据发送到 broker 的 leader(主节点),不需要在多个节点进行分发,为了帮助 producer 做到这点,所有的 Kafka 节点都可以及时的告知:哪些节点是活动的,...这样 producer 就可以直接将消息发送到目的地了 5、Kafa consumer 是否可以消费指定分区消息?

    1.2K00

    LinkedIn 互联网架构扩展简史

    它托管所有不同页面的 Web servlet、处理业务逻辑并连接到一些 LinkedIn 数据库。 啊,网站开发的美好时光 - 美好而简单 成员图 作为社交网络要做的第一件事就是管理成员之间的连接。...例如,我们需要将数据流入数据仓库,我们需要将批量数据发送到我们的Hadoop 工作流程中进行分析,我们收集并聚合每个服务的日志,我们收集页面浏览量等跟踪事件,我们需要对 inMail 消息进行排队系统,...近代 当我们从 Leo 转型为面向服务的架构时,我们提取的 API 假设是基于 Java 的 RPC,跨团队不一致,与表示层紧密耦合,而且情况只会变得更糟。...为了解决这个问题,我们构建了一个名为Rest.li的新 API 模型。Rest.li 是我们向以数据模型为中心的架构迈进的一步,它确保了整个公司一致的无状态 Restful API 模型。...我们重新考虑了我们的前端方法,将客户端模板添加到组合中(个人资料页面、大学页面)。这使得应用程序的交互性更强,要求我们的服务器仅发送 JSON 或部分 JSON。

    7800

    Java Web技术架构方案概述

    JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发...JMS本身只定义了一系列的接口规范,是一种与厂商无关的 API,用来访问消息收发系统。...它类似于 JDBC(java Database Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。...JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JML 客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。...每个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念。

    3K10
    领券