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. ASP.NET Web Form 与 ASP.NET MVC 区别

    Asp.net 微软提供web开发框架或者技术.分Web Form和ASP.NET MVC.下面简单说明各自优缺点及使用场景. Web Form ASP.NET Webform提供了一个类似于winf ...

  2. 20155305 2016-2017-2 《Java程序设计》实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 单元测试 1. ...

  3. PHP学习笔记之析构函数以及static,self,parent关键字

    引用 $jordan1 = &$jordan; 当jordan1 = null; //此时会直接调用析构函数 而当无&时,就需要等到所有的引用都为null时,才调用析构函数析构  乔丹 ...

  4. 成都Uber优步司机奖励政策(4月10日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  5. 运行ntpdate报错:Temporary failure in name resolution

    一.问题报错: 忽然发现某台机器时间慢了些几分钟,之前没有搭建ntpd服务,目前都是使用的ntpdate加定时任务进行时间同步.直接执行ntpdate报错如下: # ntpdate cn.pool.n ...

  6. Drupal学习(19) 使用jQuery

    本节学习如果在Drupal里交互使用jQuery. jQuery在Drupal是内置支持的.存在根目录的misc目录中. 当调用drupal_add_js方法,会自动加载jQuery. 在Drupal ...

  7. rpmforge

    Could not retrieve mirrorlist http://mirrorlist.repoforge.org/el6/mirrors-rpmforge error was : PYCUR ...

  8. 【JUC源码解析】CountDownLatch

    简介 CountDownLatch,是一个同步器,允许一个或多个线程等待,直到一组操作在其他线程中完成. 概述 初始CountDownLatch时,会给定count,await方法会阻塞,直到coun ...

  9. 详解UML图之类图

    产品经理的必备技能之一是画UML图,本文就告诉你怎么画标准的类图吧.本文结合网络资料和个人心得所成,不当之处,请多指教. 1.为什么需要类图?类图的作用 我们做项目的需求分析,最开始往往得到的是一堆文 ...

  10. MySQL数据库之单双表查询

    单表查询 先创建表 #创建表 create table employee( id int not null unique auto_increment, name varchar(20) not nu ...