当需要异步发送和接收大量消息时,需要在Crystal项目中引入MetaQ消息收发机制。

关于MetaQ使用的官方例子可参考:https://github.com/killme2008/Metamorphosis/wiki/%E7%AE%80%E5%8D%95%E4%BE%8B%E5%AD%90

Crystal框架将MetaQ进行封装,简化MetaQ的使用,具体如下:

消息生产端

  1. 引入crystal-metaq-producer项目最为依赖:

    <dependency>
    <groupId>com.gsoft.crystal</groupId>
    <artifactId>crystal-metaq-producer</artifactId>
    </dependency>
  2. 调用消息发送对象,发送指定消息:

    @Resource
    private MessageProducer mp;
    @Resource
    private MessageConsumer mc; @Test
    public void testProducer() {
    String topic = "test";
    final String msg = "test message !"; mp.publish(topic);
    Message message = new Message(topic, msg.getBytes());
    try {
    mp.sendMessage(message);
    } catch (MetaClientException e) {
    e.printStackTrace();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    其中,topic必须是MetaQ服务器中定义的主题之一。

    在发送消息前,必须先mp.publish(topic),与指定主题关联。

消息消费端

  1. 引入crystal-metaq-consumer项目最为依赖:

    <dependency>
    <groupId>com.gsoft.crystal</groupId>
    <artifactId>crystal-metaq-consumer</artifactId>
    </dependency>
  2. 调用消息消费对象,注册监听器:

    @Resource
    private MessageConsumer mc; @Test
    public void testProducer() {
    String topic = "test"; try {
    mc.subscribe(topic, 1024*1024, new MessageListener() { @Override
    public void recieveMessages(Message message) throws InterruptedException {
    String str = new String(message.getData());
    System.out.println("Recived Message: " + str);
    Assert.assertEquals(msg, str);
    } @Override
    public Executor getExecutor() {
    return null;
    }
    });
    mc.completeSubscribe();
    } catch (MetaClientException e1) {
    e1.printStackTrace();
    }

    其中,mc.subscribe()方法可执行多次,最后需执行mc.completeSubscribe()方法。

    另,上述方法中的1024*1024参数为接收的消息内容最大字节数,可自行调整以优化性能(不了解具体如何优化情况下,建议不要调整)。

    监听器中的recieveMessages方法即为消息消费方法,getExecutor方法返回线程池的执行器,如返回null,则不采用线程池。

如何在项目中引入MetaQ消息收发机制的更多相关文章

  1. vue-cli项目中引入第三方插件

    前言 最近有小伙伴问道如何在vue-cli项目中引入第三方插件或者库,例如如果想在项目中使用jQuery中的Ajax请求数据呢?或者我想使用Bootstrap框架呢?等等这些问题,本篇博客将带你学习如 ...

  2. 在Android项目中引入MuPdf

    由于公司手机App要加入一个附件查看功能,需要查看PDF文件,在网上找了许多第三方工具,最后选择了MuPDF. 更多第三方工具可以查看大神总结的:http://www.cnblogs.com/poke ...

  3. 如何在项目中引入 #include .h、.lib、 .dll、.cpp (转)

    源:http://blog.csdn.net/vippolka/article/details/8552735 在项目中引入.h..lib和dll.以及.cpp 1..h的引入 解决办法1:把  XX ...

  4. eclipse项目中引入shiro-freemarker-tags会jar包冲突

    maven项目中引入了这个依赖. <dependency> <groupId>net.mingsoft</groupId> <artifactId>sh ...

  5. 项目中引入composer

    众所周知,composer可以自定义加载插件库和依赖,它也是用PHP写的,怎样在自己的项目中引入并使用composer呢?. 1.新建一个项目,在项目的根目录创建composer.json文件,用过一 ...

  6. 在vue项目中引入jquery

    在vue项目中引入jquerycnpm install jquery --save在main.js中引入,加入下面这行代码:import 'jquery'注:有些项目是按需加载的,在main.js里面 ...

  7. 【vue】如何在 Vue-cli 创建的项目中引入 iView

    根据vue项目的搭建教程,以下记录如何在Vue-cli创建的项目中引入iView. 1)iView的安装,在项目下使用 npm 安装iView cnpm install  iview  --save ...

  8. 【vue】如何在 Vue-cli 创建的项目中引入iView

    根据vue项目的搭建教程,一下记录下如何在Vue-cli创建的项目中引入iView. 1)安装iView,在项目下 cnpm install  iview  --save 2 ) 在 webpack ...

  9. Struts2基本使用(一)--在项目中引入Struts2

    Struts2基本使用 在MVC开发模式中,Struts2充当控制器(Controller)的角色.其主要功能就是处理用户请求,生成响应,是连接视图层(View)和模型层(Model)的桥梁.在处理用 ...

随机推荐

  1. Spring MVC 与ExtJS完美集成

    http://blog.csdn.net/q262800095/article/details/12021191 http://www.jb51.net/article/25267.htm

  2. JS基础知识——缓动动画

    基于距离的缓动动画 原理:设定起始位置  start 和终止位置 end,变化会越来越慢. 公式:start=start+(end-start)/10;     这个10不是固定的,想分成多少份就分成 ...

  3. 微信小程序开发入门教程

    做任何程序开发要首先找到其官方文档,微信小程序目前还在邀请内测阶段,目前官方放出了部分开发文档,经过笔者一天的查看和尝试,感觉文档并不全面,但是通过这些文档已经能够看出其大概面貌了.闲话不多说,我们先 ...

  4. 让MySQL数据库支持Emoji表情

    问题:Emoji 表情是按照4个字节存储的,所以传统 mysql utf-8编码只能最大存储3字节. 解决:修改MySQL(5.5.3以上版本) 编码为utf8mb4 即可存储Emoji表,同时设置 ...

  5. 控制流之if

    if语句if语句用来检验一个条件, 如果 条件为真,我们运行一块语句(称为 if-块 ), 否则 我们处理另外一块语句(称为 else-块 ). else 从句是可选的. ~~~~~~~~~~~~~~ ...

  6. 基于Keepalvied的Mysql主主漂移(切换)

    Keepalived实现原理:Keepalived详细介绍简介 实验环境 Master1.Amoeba--IP:192.168.1.5 Master2---IP:192.168.1.10 同时安装ke ...

  7. Application_Start和Application_End事件执行时间

    Application_start: 第一个访问网站的用户会触发该方法. 通常会在该方法里定义一些系统变量,如聊天室的在线总人数统计,历史访问人数统计的初始化等等均可在这里定义. Applicatio ...

  8. 10、手把手教你Extjs5(十)自定义模块的设计

    从这一节开始我们来设计并完成一个自定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息.以下信息只是我自己在开发过程中想到或用到的,希望有新的想法的或者有建议的跟贴回复. 一个独立模块包含以下 ...

  9. slf4j与logback对接是如何将日志写到控制台的

    今天一个以前同事问了个RT的问题 我翻了下代码,简单跟了下 很简单 1. demo代码 package org.simonme.demo.log; import org.slf4j.Logger; i ...

  10. 安卓能用的modebus CRC16计算,附上对应的C语言的CRC16(转)

    源:安卓能用的modebus CRC16计算,附上对应的C语言的CRC16 “源”即是原文地址,想了解作都更多文章及思想请移步到“源”.转过只是为了本人感兴趣的文章查找方便. 正文: 最近写安卓串口通 ...