在金蝶云苍穹的二次开发环境中,通过MQ实现消息队列的自定义和消息通信。具体步骤包括创建队列配置文件、实现消费者类、注册单据插件发送消息及配置启动参数。通过这些步骤,可以实现单据上的消息发送按钮点击后向MQ队列发送消息,并由消费者类处理接收到的消息,演示了MQ在异步访问、削峰、解耦等场景下的应用。注意,轻量级环境不支持此操作,案例在团队版开发模式下进行。
标签:
二开MQ、二开队列
需求背景:
当定制化开发过程中需要异步访问/削峰/解耦等场景时可以使用mq来实现,金蝶云苍穹 支持二次开发定义自己的mq队列,下面介绍如何自定义队列并演示如何通过mq实现消息通信。
演示方案:
在单据上创建一个工具栏“消息发送”,通过单据插件实现点击“消息发送”后向MQ消息队列中发送消息;
创建消费者实现类,重写相应的方法添加“hello world”的日志输出。
轻量级环境暂不支持二开MQ,本案例是在团队版开发模式的环境下演示的
操作步骤:
1.创建二开队列配置文件及相关路径
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");
实现效果:
COSMIC_MQ入门:跑通第一个helloworld案例. …(1003.92KB)
推荐阅读