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. SVG中嵌入HTML元素

    <?xml version="1.0" standalone="yes"?> <style> .clsfont{ border:1px ...

  2. 2017-2018-1 20155230 《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155230 <信息安全技术>一.Windows口令破解 1.字典破解 (1)为本机创建新用户.为了达到实验效果,用户口令不要设置得过于复杂,可以选择自己的生日 ...

  3. 20155322 2017-2018-1《信息安全系统设计》第九周 Linux命令:pwd命令学习与简单实现

    pwd命令学习 功能 Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 格式 pwd [选项] 实例 用 pwd 命令查看默认工作目录的完整路径: 用 pwd 命令查 ...

  4. 20145234黄斐《Java程序设计》实验一—Java开发环境的熟悉(Linux + Eclipse)

    实验步骤 由于实验时间比较紧张,这里只有最终结果的截图 (一)命令行下Java程序开发 (二)Eclipse下Java程序开发.调试 (三)练习 实现求正整数1-N之间所有质数的功能,并进行测试 实验 ...

  5. #ifdef 支持Mac #ifndef 支持Windows #if defined (Q_OS_WIN) 应该可以再两个系统通用

    //mac qt可以运行 #ifdef Q_OS_MAC qDebug()<<QSysInfo::MacintoshVersion; #endif //Mac不运行 #ifndef Q_O ...

  6. RHCSA-day1

    1. 破解密码 开机 e 进入编辑模式 linux16 /boot/.............................en_US.UTF_8 这行末尾插入 rd.break (空格) ctrl ...

  7. Objective-C 方法交换实践(一) - 基础知识

    一.Objective-C 中的基本类型 首先看下 Objective-C 的对象模型,每个 Objective-C 对象都是一个指向 Class 的指针.Class 的结构如下: struct ob ...

  8. 【Unity3d】MenuItem修饰的方法无法触发的可能原因

    遇到了MenuItem修饰的方法无法触发的情况,顺利解决. 类放在Editor目录下,该类下其他方法被MenuItem修饰可以触发. 后来发现我修饰的方法和该类下另一个方法重名了. 改方法名,问题解决 ...

  9. DevOps是一种文化,不是角色!

    一.DevOps是一种文化,不是角色! 软件无处不在.在如今的世界里,每个主流公司/组织都和软件开发息息相关,并且公司需要向软件一样运作.更快且更敏捷,同时保证安全性和可靠性,这样的要求前所未有的强烈 ...

  10. Qt 链接报错 version `Qt_5' not found

    问题: 在Ubuntu 上发布软件包的时候,复制链接库的时候出现Qt 版本找不到的情况: ./libqxcb.so: /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so ...