MQ入门:跑通第一个helloworld案例原创
金蝶云社区-sharkv
sharkv
19人赞赏了该文章 4,684次浏览 未经作者许可,禁止转载编辑于2021年07月09日 14:37:23
summary-icon摘要由AI智能服务提供

在金蝶云苍穹的二次开发环境中,通过MQ实现消息队列的自定义和消息通信。具体步骤包括创建队列配置文件、实现消费者类、注册单据插件发送消息及配置启动参数。通过这些步骤,可以实现单据上的消息发送按钮点击后向MQ队列发送消息,并由消费者类处理接收到的消息,演示了MQ在异步访问、削峰、解耦等场景下的应用。注意,轻量级环境不支持此操作,案例在团队版开发模式下进行。

标签:

二开MQ、二开队列

需求背景:

当定制化开发过程中需要异步访问/削峰/解耦等场景时可以使用mq来实现,金蝶云苍穹 支持二次开发定义自己的mq队列,下面介绍如何自定义队列并演示如何通过mq实现消息通信。

演示方案:

在单据上创建一个工具栏“消息发送”,通过单据插件实现点击“消息发送”后向MQ消息队列中发送消息;

创建消费者实现类,重写相应的方法添加“hello world”的日志输出。

轻量级环境暂不支持二开MQ,本案例是在团队版开发模式的环境下演示的

操作步骤:

1.创建二开队列配置文件及相关路径

  image.pngimage.pngimage.png

  


  region写云的标识,queue name可自定义   appid  应用标识

Class  消费者的全路径

内容如下:

<root>

    <region name="kded_tc">

        <queue name="erkai_queue" appid="kded_sdemo">

            <consumer class="kd.demo.sci.consumer.DemoConsumer"></consumer>

        </queue>

    </region>

</root>

 

注意:分应用部署模式下,当前服务节点的appids中如果包含队列信息中配置的appid才可以消费该队列的消息

 

2.实现消费者类

package kd.demo.sci.consumer;

 

import kd.bos.context.RequestContext;

import kd.bos.logging.Log;

import kd.bos.logging.LogFactory;

import kd.bos.mq.MessageAcker;

import kd.bos.mq.MessageConsumer;

 

public class DemoConsumer implements MessageConsumer {

   Log log = LogFactory.getLog(getClass());

   @Override

   public void onMessage(Object message, String messageId, boolean resend, MessageAcker acker) {

      log.info("自定义DemoConsumer开始消费");

      try {

         String str = (String)message;

         log.info(str);

      } catch (Throwable e) {

         boolean discard = false; //是否废弃这条消息,根据具体场景判断

         if (discard){

            acker.discard(messageId);//废弃

            // 记录废弃原因,并写业务日志

         } else{

            acker.deny(messageId);//告诉mq重发这条消息

            // 记录异常原因,并写业务日志

         }

      }

   }

 

}

 

3.注册单据插件

package kd.demo.sci.formplugin;

 

import kd.bos.bill.AbstractBillPlugIn;

import kd.bos.form.control.events.ItemClickEvent;

import kd.bos.logging.Log;

import kd.bos.logging.LogFactory;

import kd.bos.mq.MQFactory;

import kd.bos.mq.MessagePublisher;

 

public class MQSendEdit extends AbstractBillPlugIn{

   Log Logger = LogFactory.getLog(MulThreadsEdit.class);

   @Override

   public void itemClick(ItemClickEvent evt) {

      if(evt.getItemKey().equals("sendmsg")) {

         MessagePublisher mp = MQFactory.get().createSimplePublisher("kded_tc", "erkai_queue");

         try{

              mp.publish("hello");

         }finally{

              mp.close();

         }

         

      }

   }

}

 

 

 

 

 

4.启动参数配置

System.setProperty("dubbo.registry.register", "true");

System.setProperty("mq.consumer.register", "true");

//定义一个唯一的标识别和其他人重复

System.setProperty("mq.debug.queue.tag", "sharkv");

System.setProperty("lightweightdeploy","false");

 

//队列发送方、消费方均需要该配置项,包括具体的配置文件,生产环境可配在服务节点的启动参数

System.setProperty("mqConfigFiles.config","erkai.consummqconfig.xml");

 

 

实现效果:




image.png

image.png

image.png     

赞 19