ONS, 全名Open Notification Service, 是阿里基于开源消息中间件RocketMQ的一个云产品。

首先,要申请阿里账号等。本地也可以申请阿里云账号自己调试。此处为公司拥有阿里云服务,与运维op申请ons测试可用的服务。

申请ONS需要的创建topic,PID,CID,access_key,secret_key,要给产生access_key的账户授权发布订阅功能权限,具体请看其他配置阿里云账户权限的文章。

提供了这些以后,可以在官网查看ons快速入门文档创建简单的demo测试类调试生产和消费

使用ONS API发送订阅消息的示例

首先,pom引用ons-client

        <!-- RocketMq ons-client-->
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>ons-client</artifactId>
<version>1.7.0.Final</version>
</dependency>

第二步,配置消费者:

  • 创建一个常量类存放
/**
* 公共参数配置
*
*/
public interface MqConfigParams { //测试ons配置文件
public static final String TOPIC = "你申请下来的topic";
public static final String TAG = "*";
public static final String PRODUCER_ID = "你申请下来的pid";
public static final String CONSUMER_ID = "你申请下来的cid";
public static final String ACCESS_KEY = "你申请下来的accesskey";
public static final String SECRET_KEY = "你申请下来的secretkey";
public static final String ONS_ADDR = "http://onsaddr-internet.aliyun.com/rocketmq/nsaddr4client-internet"; }
  • 创建一个生产者类,此处填入配置文件中的常量类,然后调用getproduce方法时启动生产者 producer.start();
import com.aliyun.openservices.ons.api.*;
import java.util.Date;
import java.util.Properties; public class ONSUtil { /**
* 获取消息的 Producer
*
* @return Producer
*/
public static Producer getProducer() {
Properties properties = new Properties();
properties.put(PropertyKeyConst.ProducerId, MqConfigParams.PRODUCER_ID);
properties.put(PropertyKeyConst.AccessKey, MqConfigParams.ACCESS_KEY);
properties.put(PropertyKeyConst.SecretKey, MqConfigParams.SECRET_KEY);
Producer producer = ONSFactory.createProducer(properties); // 在发送消息前,必须调用start方法来启动Producer,只需调用一次即可。
producer.start();
return producer;
}
} 
  • 封装一个发送消息的方法。
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.SendResult; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; @Service
public class OnsProducer {
private final static Logger logger = LoggerFactory.getLogger(SeoLogController.class); public void sendMessage(String topic, String tag, String msgStr) {
StringBuilder logsb = new StringBuilder("send OnsMQ Msg:");
Message msg = getInstance(topic, tag, msgStr);
String messageId = "";
Producer producer = ONSUtil.getProducer(); //你申请的producerId
SendResult sendResult = producer.send(msg);
messageId = sendResult.getMessageId();
if (messageId != null && !messageId.equals("")) {
logsb.append("[OnsProducer] : " + "{ messageId : " + messageId + " , msgStr :" + msgStr + "}");
} else {
logsb.append("[OnsProducer] fail: " + "{ " + " msgStr :" + msgStr + "}");
}
logger.debug(logsb.toString());
} private static Message getInstance(String topic, String tag, String body) {
if (body.equals("") || body == null)
body = "";
Message msg = new Message(topic, tag, body.getBytes());
return msg;
}
}  

这样就配置好了生产者。

调用生产者

可以写一个test类用main方法调试,示例这里是直接写main方法执行上面封装的内容直接执行看查看日志看是否成功

import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.SendResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class TestSendMessage {
private final static Logger logger = LoggerFactory.getLogger(TestSendMessage.class);
public static void main(String[] args) {
StringBuilder logsb = new StringBuilder("send OnsMQ Msg:");
Producer producer = ONSUtil.getProducer(); //你申请的producerId
Message msg = new Message(MqConfigParams.TOPIC, //你申请的TopicName
"*","这是消息2".getBytes());
SendResult sendResult = producer.send(msg);
String messageId = "";
messageId = sendResult.getMessageId();
if (messageId != null || !messageId.equals("")) {
logsb.append("[OnsProducer] : " + "{ messageId : " + messageId + " , msgStr :" + "这是消息2" + "}");
} else {
logsb.append("[OnsProducer] fail: " + "{ " + " msgStr :" + "这是消息2" + "}");
}
logger.debug(logsb.toString());
}
}
    @RequestMapping(value = "/testmqProducer", method = RequestMethod.GET)
public void testmq() {
OnsProducer onsProducer=new OnsProducer();
String msg = "testmq";
onsProducer.sendMessage(MqConfigParams.TOPIC,"*",msg);
}

接下来写消费者示例:

  • 创建监听类实现MessageListener此处是处理业务逻辑因为此处可以得到消费的内容
import com.aliyun.openservices.ons.api.Action;
import com.aliyun.openservices.ons.api.ConsumeContext;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.MessageListener; import java.util.Date; public class MyMessageListener implements MessageListener {
@Override
public Action consume(Message message, ConsumeContext consumeContext) {
System.out.println("Receive @" + new Date() + ": " + message);
        //此处可以写具体业务逻辑,body是具体发送的内容
String body = new String(message.getBody());
System.out.println("msgBody is : " + body);
return Action.CommitMessage;
}
} 
  • 创建消费者启动类和方法
import com.aliyun.openservices.ons.api.Consumer;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst; import java.util.Date;
import java.util.Properties; public class MyMessageConsumer {
/**
* 订阅消息
*/
public void subscribe() {
Properties properties = new Properties();
properties.put(PropertyKeyConst.ConsumerId, MqConfigParams.CONSUMER_ID);
properties.put(PropertyKeyConst.AccessKey, MqConfigParams.ACCESS_KEY);
properties.put(PropertyKeyConst.SecretKey, MqConfigParams.SECRET_KEY);
Consumer consumer = ONSFactory.createConsumer(properties);
consumer.subscribe(MqConfigParams.TOPIC, "*", new MyMessageListener());//此处可以写父类messageListener但是必须实现方法这里就是用到了上面写的myMessageListener
consumer.start();
System.out.println(MqConfigParams.CONSUMER_ID + " is running @" + new Date());
}
}
  • 在Application启动类中加入消费者启动调用方法
@SpringBootApplication
@MapperScan("com.ons.test")
public class Application {
public static void main(String[] args) {
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(Application.class,args);
new MyMessageConsumer().subscribe(); // 系统启动的时候启动订阅
}}

ONS发布订阅消息的更多相关文章

  1. JMS发布/订阅消息传送例子

    前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...

  2. Kafka是分布式发布-订阅消息系统

    Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...

  3. 高吞吐量的分布式发布订阅消息系统Kafka--安装及测试

    一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因 ...

  4. 分布式发布订阅消息系统 Kafka 架构设计[转]

    分布式发布订阅消息系统 Kafka 架构设计 转自:http://www.oschina.net/translate/kafka-design 我们为什么要搭建该系统 Kafka是一个消息系统,原本开 ...

  5. 分布式发布订阅消息系统Kafka

    高吞吐量的分布式发布订阅消息系统Kafka--安装及测试   一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览, ...

  6. Kafka logo分布式发布订阅消息系统 Kafka

    分布式发布订阅消息系统 Kafka kafka是一种高吞吐量的分布式发布订阅消息系统,她有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳 ...

  7. 发布-订阅消息系统Kafka简介

    转载请注明出处:http://www.cnblogs.com/BYRans/ Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式 ...

  8. Kafka(分布式发布-订阅消息系统)工作流程说明

    Kafka系统架构Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和 ...

  9. 【9】JMicro微服务-发布订阅消息服务

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. JMicro消息服务目前实现特性 a. JMicro只支持发布订阅消息服务,不支持队列式消息服务: b. 不支持消息持 ...

随机推荐

  1. python--基本类型之元组

    tuple(元组): 定义和创建和作用: 元组--只读列表,只可以被查询,不能被修改.所以,列表的切片操作同样适用与元组. 元组写在小括号(())里,元素之间用逗号隔开. 虽然元组的元素不可改变,但他 ...

  2. 20155212 2016-2017-2 《Java程序设计》第2周学习总结

    20155212 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 三种print System.out.println:在标准输出中显示文字后换行. Syst ...

  3. 20155239 实验四 Android程序设计

    20155239 实验四 Android程序设计 目录 第24章:初识Android 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学习 ...

  4. 20155304 2016-2017-2 《Java程序设计》实验三 敏捷开发与XP实践

    实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软件工程包括下列领 ...

  5. 带偏移量的AES加密工具

    自定义的一个对称加密工具类AESUtil.java public static final String ENCRYPTION_ALGORITHM = "AES"; public ...

  6. bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏)

    bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏) 据说正解是并查集???我不会 这不是一道匈♂牙利好题吗??? 一个装备的两个属性都向它连边,然后跑一遍匈♂牙利 注意: ...

  7. 读懂UML类图

    平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道.实际上,UML类图中最常用到的元素五分钟就能掌握,下面赶紧来一起认识一下它吧: 一.类的属性的表示方式 在UML类图中,类使用包含类 ...

  8. Python小白学习之如何添加类属性和类方法,修改类私有属性

    如何添加类属性和类方法,修改类私有属性 2018-10-26  11:42:24 类属性.定义类方法.类实例化.属性初始化.self参数.类的私有变量的个人学习笔记 直接上实例: class play ...

  9. Qt-Qt5最新增加程序图标方式

    亲爱的小伙伴吗,还记得原始的Qt4是怎么给运行程序添加图标的么,是不是先准备一个ICON文件,问了在家里建立一个rc文件,在文件里面加上 IDI_ICON1               ICON    ...

  10. katalon系列十七:报告&Katalon Analytics

    一.邮件报告Suite执行完后,严格来说这个不算报告,只是邮件通知执行结果,具体设置请看katalon系列三 二.文件报告Suite执行完后,会在项目文件夹下/Report/Suite Name/ti ...