0、环境准备

0.1、linux

0.2、java

0.3、下载apollo二进制包,解压

0.4、创建broker,名字为 userlog

{APOLLO_HOME}/bin/apollo create userlog

0.5 启动apollo

cd {APOLLO_HOME}/userlog

bin/apollo-broker run

如果需要以服务形式启动,执行下面命令

sudo ln -s "/opt/db/apache-apollo-1.7.1/test/bin/apollo-broker-service" /etc/init.d/

/etc/init.d/apollo-broker-service start

1、各协议开放的端口

INFO  | Accepting connections at: tcp://0.0.0.0:61613

INFO  | Accepting connections at: tls://0.0.0.0:61614

INFO  | Accepting connections at: ws://0.0.0.0:61623/

INFO  | Accepting connections at: wss://0.0.0.0:61624/

INFO  | Administration interface available at: https://127.0.0.1:61681/

INFO  | Administration interface available at: http://127.0.0.1:61680/

3、生产者

Client c = new Client("172.16.163.141", 61613, "admin", "password");

final HashMap headers = new HashMap();

for (int i = 0; i < 5; i++) {

c.send("/topic/productlogs", "M" + i);

System.out.println("Send:" + "M" + i);

Thread.sleep(20);

}

c.disconnect(headers);

4、消费者

Client c = new Client("172.16.163.141", 61613, "admin", "password");

final HashMap headers = new HashMap();

c.subscribe("/topic/productlogs", new Listener() {

@Override

public void message(Map headers, String body) {

System.out.println("receive:" + body);

}

}, headers);

4.1、发送消息

先启动生产者,这时没有消费者,消息会被丢掉。消息发送完后,toplic会被自动删掉

注意:当不进行持久化的时候,在生产者启动之后的消费者,不能收到生产者发送的历史消息,只能从没有丢掉的消息开始接收。

4.2、消费消息

启动消费者,这时,如果有消息,将打印消息内容。

如果消费者启动2份,每一个消费者,将会受到所有消息,如,生产者发5条消息,这5条消息,这些消费者每个都收到5条消息

4.3 消息分组与持久化

下面我们事先所有消费者均摊这5条消息

消费者中添加以下代码

headers.put("persistent", "true");//persistent 的值为string,否则,会产生意想不到的效果(所有消费者都收不到任何消息)

headers.put("id", "dusb_1");//id 为消息分组的依据,每一组收到全量消息。id相同的消费者,均摊该组的所有消息。

//headers.put("credit", "50,0");

实验1:

启动2份消费者,这时,消息被均摊到这两个消费者上,比如,第一个消费者收到3条,第二条收到2条,即消息均摊。

实验2:

此时,若是,关闭所有消费者,重新启动生产者,发送5条消息,

web页面上durable subs 会有5条消息持久化,之后消费者head id为dsub_1的消费者,才会接受刚才发送的消息。

结论:当该id组的消费者都挂掉的时候,消息会进行持久化。下次该组消费者启动时,继续进行消息消费。

思考:这时候,如果启动四个消费者,两个消费者id为dusb_1,另外两个消费者id为dusb_2,启动生产者发送5条消息,这5条消息会怎么分发。

答案:

5条消息按照id进行广播,即id 为dusb_1的2个消费者收到这5条消息。这5条消息在2个消费者之间进行均摊。

id 为dusb_2的2个消费者也收到这5条消息,5条消息在这两个消费者之间进行均摊

再次思考1:接上面实验,若是断开2个分组内的所有消费者,用生产者,发送5条消息。此时直接重启机子,消息该怎么持久化?

结果:dusb_1持久化5条消息,dsub_2也持久化5条消息。

再次思考2:若刚才没有直接重启机子,而是启动id为dsub_2的消费者进行消费。当该组消息被消费完后,直接重启机子。消息该怎么持久化。

结果:dusb_1持久化5条消息,dusb_2由于消息已经消费完,所以没有消息被持久化。

重启机子:用于模拟意外状况。

结论:持久化的粒度是durable subs,也就是说persistent必须和id一起使用。说明该组消息已经被持久化

5、stomp消息确认Ack

消息确认方式:auto 默认自动确认。即:只要接收到消息,即认为消息消费成功,进行自动确认。

客户端确认:client 确认当前消息时,顺便确认之前没有来得急确认的消息。比如确认消息还没发送到服务端,就断开了。

客户端确认:client-individual  只确认当前消息

6、消息驳回NACK

ack模式为client-individual:适用于驳回当前单个消息,

ack模式为client:适用于驳回那些还没有被ACK'edNACK'ed的消息

其他参数详见:http://www.cnblogs.com/piaolingzxh/p/5450176.html

 7、apollo web ui

入口: https://127.0.0.1:61681/

默认账户密码:admin password

7.1 主要概念

queue:当生产者和消费者都断开时,会自动删除。格式:/queue/myQueueName

topic:当生产者和消费者都断开时,会自动删除。格式:/topic/myTopicName

durable subs:消息分组的依据。持久化的粒度

7.2 有图有真相

查看durable subs,可以看到刚才实验的两个id,分别为dsub_1,dsub_2

点击dsub_1 ,查看该id分组的持久化信息

生产者、消费者如下

7.3 实用技巧:定位生产者、消费者程序

上边可以看到生产者和消费者的IP及端口,

下边,我们通过IP及端口定位程序,

ssh到IP地址

lsof -i:59446 #列出占用该端口的进程PID信息,如4133

ps -ef | grep 4133

这样就可以定位到主进程文件了。

apollo stomp client 代码示例的更多相关文章

  1. 用户自定义协议client/server代码示例

    用户自定义协议client/server代码示例 代码参考链接:https://github.com/sogou/workflow message.h message.cc server.cc cli ...

  2. Java基础知识强化之IO流笔记72:NIO之 NIO核心组件(NIO使用代码示例)

    1.Java NIO 由以下几个核心部分组成: Channels(通道) Buffers(缓冲区) Selectors(选择器) 虽然Java NIO 中除此之外还有很多类和组件,Channel,Bu ...

  3. JAVA NIO工作原理及代码示例

    简介:本文主要介绍了JAVA NIO中的Buffer, Channel, Selector的工作原理以及使用它们的若干注意事项,最后是利用它们实现服务器和客户端通信的代码实例. 欢迎探讨,如有错误敬请 ...

  4. SFTP客户端代码示例

    参考链接:SFTP客户端代码示例 操作系统:Windows7/8,VS2013 环境:libssh2 1.4.3.zlib-1.2.8.openssl-1.0.1g 原文: “从http://www. ...

  5. Ice简介+Qt代码示例

    1.ICE是什么? ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,它封装并 ...

  6. WebSocket使用中Stomp Client连接报ERROR CODE 200的解决办法

    [转] https://www.cnblogs.com/chrischeng/p/10237523.html 最近在做一个WebSocket项目,后台使用了Stomp协议的WebSocketConfi ...

  7. Jsoup代码示例、解析网页+提取文本

    使用Jsoup解析HTML 那么我们就必须用到HttpClient先获取到html 同样我们引入HttpClient相关jar包 以及commonIO的jar包 我们把httpClient的基本代码写 ...

  8. socket模块实现基于UDP聊天模拟程序;socketserver模块实现服务端 socket客户端代码示例

    socket模块 serSocket.setblocking(False) 设置为非阻塞: #coding=utf-8 from socket import * import time # 用来存储所 ...

  9. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

随机推荐

  1. 六、Mosquitto 高级应用之SSL/TLS

    mosquitto提供SSL支持加密的网络连接和身份验证.本章节讲述次功能的实现. 在此之前需要一些准备工作. 准本工作: 一台 Linux 服务器. 安装好 openssl (不会明白怎么安装 op ...

  2. (转)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

    程序在内存有五个存在区域: A:动态区域中的栈区  B:动态区域中的栈区 C:静态区域中:全局变量 和静态变量    (这个区域又可以进一步细分为:初始化的全局变量和静态变量    以及    未初始 ...

  3. Python 集合(set)的使用总结

    集合的特点:去重.无序,因此无法通过下标取值. 1. 定义集合 s = set() #定义空的集合 s2 = {'} # 不是key -value形式的话就是集合,不是字典 s3 ={'} print ...

  4. iis7.5安装配置php环境详细清晰教程,三步实现【图文】

    iis7.5安装配置php环境详细清晰教程,三步实现[图文] iis7.5是安装在win7.win8里的web服务器,win2003.win2000的web服务器使用的是iis6.0,由于win7.w ...

  5. 深入理解JS对象和原型链

    函数在整个js中是最复杂也是最重要的知识 一个函数中存在多面性: 1.它本身就是一个普通的函数,执行的时候形成的私有作用域(闭包),形参赋值,预解释,代码执行,执行完 成后栈内存销毁/不销毁. 2.& ...

  6. Java设计原则—接口隔离原则(转)

    接口隔离原则 Interface Segregation Principle    定义: 客户端不应该依赖它不需要的接口 类间的依赖关系应该建立在最小的接口上 我们可以把这两个定义概括为一句话:建立 ...

  7. Bridge Serial-Ports over network

    https://stackoverflow.com/questions/29207980/bridge-serial-ports-over-network For an application, wh ...

  8. C#小票打印机动态纸张尺寸

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. MVP架构学习

    MVP架构学习 M:数据层(数据库,文件,网络等...) V:UI层(Activity,Fragment,View以及子类,Adapter以及子类) P:中介,关联UI层和数据层,因为V和M是相互看不 ...

  10. JS正则表达式从入门到入土(4)—— 预定义类与边界

    预定义类 正则表达式提供预定义类来匹配常见的字符类 字符 等价类 含义 . [^\r\n] 除了回车符和换行符以外的所有字符 \d [0-9] 数字字符 \D [^0-9] 非数字字符 \s [\t\ ...