当需要异步发送和接收大量消息时,需要在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项目最为依赖:

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

    1. @Resource
    2. private MessageProducer mp;
    3. @Resource
    4. private MessageConsumer mc;
    5.  
    6. @Test
    7. public void testProducer() {
    8. String topic = "test";
    9. final String msg = "test message !";
    10.  
    11. mp.publish(topic);
    12. Message message = new Message(topic, msg.getBytes());
    13. try {
    14. mp.sendMessage(message);
    15. } catch (MetaClientException e) {
    16. e.printStackTrace();
    17. } catch (InterruptedException e) {
    18. e.printStackTrace();
    19. }

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

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

消息消费端

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

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

    1. @Resource
    2. private MessageConsumer mc;
    3.  
    4. @Test
    5. public void testProducer() {
    6. String topic = "test";
    7.  
    8. try {
    9. mc.subscribe(topic, 1024*1024, new MessageListener() {
    10.  
    11. @Override
    12. public void recieveMessages(Message message) throws InterruptedException {
    13. String str = new String(message.getData());
    14. System.out.println("Recived Message: " + str);
    15. Assert.assertEquals(msg, str);
    16. }
    17.  
    18. @Override
    19. public Executor getExecutor() {
    20. return null;
    21. }
    22. });
    23. mc.completeSubscribe();
    24. } catch (MetaClientException e1) {
    25. e1.printStackTrace();
    26. }

    其中,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. 请教<context:component-scan/>和<mvc:annotation-driven/>的区别20

    http://www.iteye.com/problems/66133 FileSystemXmlApplicationContext

  2. php 访问对象的属性(当属性的键名称为数字时)的方法 {}

    这篇文章下面写了一个 将 数组转化成对象的方法, 这个数组的键为数字(即数组为索引数组), 访问对象的时候, $obj->1 显然错位,那到底该怎么样访问对象的数字属性呢? $obj->{ ...

  3. css控制div显示/隐藏方法及2种方法比较原码 - czf164的专栏 - 博客频道 - CSDN.NET

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  4. 从url下载图片--java与python实现方式比较

    从url下载图片--java与python实现方式比较 博客分类: 技术笔记小点滴 javapython图片下载  一.java的实现方式 首先读取图片 //方式一:直接根据url读取图片 priva ...

  5. [Unity]SQLite-C#调用

    SQLite数据库-Unity操作 项目开发的时候,经常会遇到的一种需求,数据存储 离线缓存的数据类型很多,大致分成两类 字符串文本数据 多媒体数据 字符串数据的类型只有字符串,但是结构有很多: xm ...

  6. 推荐几个web中常用js图表插件

    作者:zccst 我自己用过fusioncharts和highchart. jQuery插件有: TufteGraph flot js charts jqchart elycharts jquery ...

  7. MQTT研究

    http://www.jianshu.com/collection/1c742515f8d8 http://blog.csdn.net/gaojq_ios/article/details/481597 ...

  8. 《玩转Bootstrap(JS插件篇)》笔记

    导入JavaScript插件 不论是单独导入还一次性导入之前必须先导入jQuery库. 一次性导入 <script src="js/bootstrap.min.js"> ...

  9. MySQL导入sql脚本中文乱码设置和常用命令

    1. use database_name; 2. set names utf8; (或其他需要的编码) 3. source example.sql (sql文件存放路径) Mysql安装目录数据库目录 ...

  10. Vector类

    /* * Vector的特有功能 * * Vector出现较早,比集合更早出现 * * 1:添加功能 * public void addElement(Object obj);//用add()替代 * ...