首页 文章 精选 留言 我的

精选列表

搜索[文件预览],共10039篇文章
优秀的个人博客,低调大师

事件领域模型 kaka-core 5.0 预览版发布

kaka-core 是一项服务于 Java 后端的事件领域模型,全局事件通知框架。 kaka-core 已移至 https://gitee.com/zkpursuit/kaka-core , 并支持 maven 直接安装。 本次更新新增与第三方消息队列对接的功能 1、稍加编码就能对接市面上所有第三方消息队列。 2、通过消息队列派发和消费事件可由远程事件处理器处理并返回处理结果。 3、返回处理结果与本地执行事件完全相同(注:SyncResult消费处理远程事件时不可用)。 4、事件保证一次消费处理,不会多次重复处理。 5、稳定性完全由第三方消息队列决定。 原理:每个事件调度中心为消息的发布者亦为消息的订阅者,派发事件即将事件发布到消息队列,订阅者消费到事件后本地化处理事件,处理完成后再次将事件发布到消息队列,根据事件ID在发送方找到缓存在内存的原始事件对象并进行结果赋值或回调。 原理执行流程图(感谢用户 微信名:碧涛 提供此图): 基本范例: Facade facade = FacadeFactory.getFacade(); //以下通过ActiveMQ消息队列消费处理事件,并获得事件处理结果 facade.initRemoteMessageQueue(new ActiveMQ("event_exec_before", "event_exec_after")); //此行全局一次设定 Message message = new Message("20000", "让MyCommand接收执行"); IResult<String> result4 = message.setResult("ResultMsg", new AsynResult<>(5000)); facade.sendMessageByQueue(message); System.out.println("消息队列消费处理事件结果:" + result4.get()); facade.sendMessageByQueue(new Message("40000", "", (IResult<Object> result) -> { String clasz = ((CallbackResult<Object>) result).eventHanderClass; StringBuilder sb = new StringBuilder("消息队列消费处理事件结果异步回调:\t" + clasz + "\t"); Object resultObj = result.get(); if (resultObj instanceof Object[]) { Object[] ps = (Object[]) resultObj; sb.append(Arrays.toString(ps)); } else { sb.append(resultObj); } System.out.println(sb); })); package kaka.test; import com.kaka.notice.RemoteMessageQueue; import kaka.test.util.KryoSerializer; import kaka.test.util.Serializer; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; /** * 本类仅为测试用例,ActiveMQ消息队列的访问实现代码是否为最优不做考虑,在此仅为范例参考 */ public class ActiveMQ extends RemoteMessageQueue { private static class TestLocalMessageCache implements LocalMessageCache { private final Map<String, com.kaka.notice.Message> localMap = new ConcurrentHashMap<>(); @Override public void add(String id, com.kaka.notice.Message message) { localMap.put(id, message); } @Override public com.kaka.notice.Message remove(String id) { return localMap.remove(id); } } private static final String BROKER_URL = "tcp://101.34.22.36:61616"; private final ActiveMQConnectionFactory activeMQConnectionFactory; private final Serializer<MessageWrap> eventSerializer = new KryoSerializer<>(); public ActiveMQ(String beforeTopic, String afterTopic) { super(beforeTopic, afterTopic); this.activeMQConnectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, BROKER_URL); this.init(); } @Override protected LocalMessageCache initLocalMessageCache() { return new TestLocalMessageCache(); } @Override protected void publishEventMessage(MessageWrap msgWrap, String topic) { byte[] bytes = this.eventSerializer.serialize(msgWrap); try { Connection connection = activeMQConnectionFactory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(session.createQueue(topic)); producer.setDeliveryMode(DeliveryMode.PERSISTENT); BytesMessage bytesMessage = session.createBytesMessage(); bytesMessage.writeBytes(bytes); producer.send(bytesMessage); producer.close(); connection.close(); session.close(); } catch (JMSException e) { e.printStackTrace(); } } private void init() { new Thread(() -> { try { consume(beforeTopic, (byte[] bytes) -> { MessageWrap remoteMsgWrap = eventSerializer.deserialize(bytes); receivedBeforeEventMessage(remoteMsgWrap); //这里很重要,必须调用 }); } catch (Exception e) { e.printStackTrace(); } }).start(); new Thread(() -> { try { consume(afterTopic, (byte[] bytes) -> { MessageWrap remoteMsgWrap = eventSerializer.deserialize(bytes); receivedAfterEventMessage(remoteMsgWrap); //这里很重要,必须调用 }); } catch (Exception e) { e.printStackTrace(); } }).start(); } private void consume(String topic, Consumer<byte[]> callback) throws Exception { Connection connection = this.activeMQConnectionFactory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue(topic); MessageConsumer consumer = session.createConsumer(destination); while (true) { Message message = consumer.receive(); if (null == message) break; if (message instanceof BytesMessage) { BytesMessage bytesMessage = (BytesMessage) message; try { int byteSize = (int) bytesMessage.getBodyLength(); byte[] bytes = new byte[byteSize]; bytesMessage.readBytes(bytes); callback.accept(bytes); } catch (JMSException e) { e.printStackTrace(); } } } consumer.close(); session.close(); connection.close(); } } 以上范例完整代码可在源码 test 中查阅, 源码地址:https://gitee.com/zkpursuit/kaka-core/tree/master/src/test/java/kaka/test

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册