注解将Java 对象转Apama的event

简易的EventManager实现 首先,这篇博文是参考了http://blog.sina.com.cn/s/blog_5b6cb9500102uypp.html 这个文章作者的思路而设计的。经过自己的理解后,模仿了一个消息系统给自己用,下面谈谈对这个系统的认识和看法。我所制作的EventManager的核心是: 1.把我们游戏中所有用到的方法,全部放在一个枚举中,如下:public enum GameEvent { 阅读详情

    项目中需要整合web框架和apama平台,用Apama提供的engineClient互相链接。在交互时将java类封装成event会非常麻烦,目前知道两种办法:

    1、拼接成字符串:将消息拼成字符串

String eventStr = "com.event.TestEvent('field1','field2','field3')";
Event event = new Event(eventStr);

    2、用Event类包装

EventType eventType = new EventType("com.event.TestEvent")
eventType.addField('field1name', StringFieldType.TYPE);
eventType.addField('field2name', StringFieldType.TYPE);
eventType.addField('field3name', StringFieldType.TYPE);

Event event = new Event(eventType);
event.setField('field1name', field1);
event.setField('field2name', field2);
event.setField('field3name', field3);

每一次交互都需要用这样的方法处理一遍,代码容易出错也不易维护,就用了注解方式处理

注解:EventField

package com.test.common.apama;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 用于标记变量在EVENT中的名称及类型
 * @Author: ZH
 * @Date: Created on 16:28 2018/3/13.
 */
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD})//次注解作用于类和字段上
public @interface EventField {
    /**
     * 获取名称
     * @return
     */
    String name() default "";
}

注解处理类ApamaUtils:

package com.test.common.apama;

import com.apama.event.Event;
import com.apama.event.parser.BooleanFieldType;
import com.apama.event.parser.DictionaryFieldType;
import com.apama.event.parser.EventType;
import com.apama.event.parser.FloatFieldType;
import com.apama.event.parser.IntegerFieldType;
import com.apama.event.parser.SequenceFieldType;
import com.apama.event.parser.StringFieldType;
import com.finesys.common.utils.StringUtils;

import java.lang.reflect.Field;

/**
 * APAMA工具类
 *
 * @Author: ZH
 * @Date: Created on 15:59 2018/3/13.
 */
public class ApamaUtils {
    /***
     * 根据类获取EventType-只能处理int、String、double、float、char、int[]、double[]、float[]、string[]、boolean[]、map<string,string>
     * @param packageName
     * @param clazz
     * @return
     */
    public static EventType getEventTypeByClass(String packageName, Class clazz) {
        EventField packageInfo = (EventField) clazz.getAnnotation(EventField.class);
        if (StringUtils.isEmpty(packageName) && packageInfo != null) {
            packageName = packageInfo.name();
        }
        if (StringUtils.isEmpty(packageName)) {
            throw new NullPointerException("未获取packageName");
        }
        EventType eventType = new EventType(packageName);
        Field[] fields = clazz.getDeclaredFields();
        if (fields != null && fields.length > 0) {
            for (Field field : fields) {
                //解析注解
                EventField fieldType = field.getAnnotation(EventField.class);
                if (fieldType == null) {
                    continue;
                }
                //string类型
                String simpleName = field.getType().getSimpleName();
                //获取变量名称
                String name = field.getName();
                if (StringUtils.isNotEmpty(fieldType.name())) {
                    name = fieldType.name();
                }
                if (simpleName.equals("String") || simpleName.equals("char")) {
                    eventType.addField(name, StringFieldType.TYPE);
                    continue;
                }
                //int类型
                if (simpleName.equals("int")) {
                    eventType.addField(name, IntegerFieldType.TYPE);
                    continue;
                }
                //double类型
                if (simpleName.equals("double") || simpleName.equals("float")) {
                    eventType.addField(name, FloatFieldType.TYPE);
                    continue;
                }
                //boolean类型
                if (simpleName.equals("boolean")) {
                    eventType.addField(name, BooleanFieldType.TYPE);
                    continue;
                }
                //String[]类型数组
                if (simpleName.equals("String[]") ) {
                    eventType.addField(name, new SequenceFieldType(StringFieldType.TYPE));
                    continue;
                }
                //int[]类型数组
                if (simpleName.equals("int[]") ) {
                    eventType.addField(name, new SequenceFieldType(IntegerFieldType.TYPE));
                    continue;
                }
                //double[]类型数组或者float[]类型
                if (simpleName.equals("double[]")||simpleName.equals("float[]") ) {
                    eventType.addField(name, new SequenceFieldType(FloatFieldType.TYPE));
                    continue;
                }
                //boolean[]类型数组
                if (simpleName.equals("boolean[]")||simpleName.equals("float[]") ) {
                    eventType.addField(name, new SequenceFieldType(BooleanFieldType.TYPE));
                    continue;
                }
                //map类型,只支持String\String类型
                if (simpleName.equals("Map") ) {
                    eventType.addField(name, new DictionaryFieldType(StringFieldType.TYPE,StringFieldType.TYPE));
                    continue;
                }

            }
        }
        return eventType;
    }

    public static Event getEventByObject(Object object) {
        return getEventByObject(null, object);
    }

    /**
     * 获取指定对象的Event
     * @param packageName
     * @param object
     * @return
     */
    public static Event getEventByObject(String packageName, Object object) {
        Event event = new Event(getEventTypeByClass(packageName,object.getClass()));
        Field[] fields = object.getClass().getDeclaredFields();
        if (fields != null && fields.length > 0) {
            for (Field field : fields) {
                //解析注解
                EventField eventField = field.getAnnotation(EventField.class);
                if (eventField == null) {
                    continue;
                }
                //修改权限
                boolean accessFlag = field.isAccessible();
                field.setAccessible(true);
                Object o;
                try {
                    //获取变量值
                    o = field.get(object);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                    continue;
                }
                String name = field.getName();
                if (StringUtils.isNotEmpty(eventField.name())) {
                    name = eventField.name();
                }
                if (StringUtils.isNotEmpty(name) && o != null) {
                    event.setField(name, o);
                }
                //还原权限
                field.setAccessible(accessFlag);
            }
        }
        return event;
    }
   @EventField(name = "com.text.Test")
   static class Test {
        @EventField(name = "String")
        public String StringName;
        @EventField
        public int intName;
        @EventField()
        private float floatName;
    }
}
在使用注解时变量声明顺序应该和event中顺序一致,否则赋值会混乱。考虑在注解中加一个排序字段。


    

Event-Manager-:一个java组项目, 事件管理器 一个java组项目 基于Java的软件 活动管理系统项目摘要: 现有系统:在现有系统中,有大量的文书工作; 由于大部分作品都包括人工处理,因此非常耗时且不经济。 记录难以存储在人工系统中,需要更多的体力劳动。 提议的系统:在提议的事件管理系统中,一切都是基于网络的。 这将立即减少手动处理,从而提高事件管理过程的速度。 系统中有各种功能和模块来执行各种功能。 从长远来看,这总体上提高了管理效率,消除了纸张工作,减少了人力,并被证明是非常经济的。 特点: 事件管理系统是一个基于网络的项目,它非常简单、易用和灵活。 该项目的主要特点或功能是: 参与学生的注册 安排会议 通过电子邮件邀请参与者 取消活动 收集学生的反馈 记录教职员工的出勤详情 生成各种反馈报告 模块概述:事件管理系统是一个三模块项目。 项目中的模块有:管理员模块、学生模块和教师模块。 管理员模块:该模块处理诸如 立即下载

相关推荐

Apama中文版用户手册

SoftwareAG内部资料,由浅入深全面介绍了Apama的技术应用。

apama学习笔记

名词解释 基础组件 Application 一个Apama应用程序有一个或多个monitor、一个或多个query组成 Package 类似java中的package Context 可以将EPL应用加载到多个线程中执行。 创建context时,是启动了一个线程池,还是启动一个线程 如何销毁context 4.Monitor 既可以有数据也可以有逻辑,可以接受...

misxu890312的博客 3408

SimpleEvents:一个简单的Java EventManager

简单事件 一个使用lambdas的简单Java EventManager Gradle repositories { maven { name = "jitpack.io" url = "https://jitpack.io" } } dependencies { compile "com.github.Tigermouthbear:SimpleEvents:master-SNAPSHOT" } Java public class Main { static EventManager EVENT_MANAGER = new EventManager(); // Create new EventManager public static void main(String[] args) { EVENT_MANAGER.re

单线程事件处理器ControllerEventManager

单线程事件处理器,Controller端定义的一个组件。该组件内置了一个专属线程,负责处理其他线程发送过来的Controller事件。还定义了一些管理方法,为专属线程输送待处理事件。0.11.0.0版本前,Controller组件源码复杂。集群元数据信息在程序中同时被多个线程访问,因此,源码里有大量Monitor锁、Lock锁或其他线程安全机制,导致晦涩难懂,改动困难0.11.0.0版本开始,社区重构Controller代码结构。将多线程并发访问改为单线程的事件队列方式。

JavaEdge全是干货的技术号 3280

学术类PPT制作总结

本文分享了科技类PPT的制作技巧,希望相关的信息能帮助到读者。

奇妙水果的技术博客,欢迎交流技术~ 2881

ModelSim 2020.4破解失败?手把手教你解决‘Unable to checkout viewer license‘报错(附环境变量配置)

本文针对ModelSim 2020.4启动时遇到的‘Unable to checkout viewer license’报错,提供了从理解许可证机制到分步修复的完整指南。文章深入解析了viewer license与图形用户界面(GUI)的关系,并详细说明了通过生成有效许可证文件、精准配置系统环境变量及替换关键文件来解决图形界面启动失败的问题,帮助用户彻底修复并理解其背后的逻辑。

k6l7m8n9的博客 990

Event事件-6:new Event自定义事件 / addEvent绑定自定义 / trigger触发自定义 / removeEvent移除自定义

newEvent 自定义事件 newEvent(typeArg,eventInit) typeArg事件名称 eventInit "bubbles",可选,Boolean类型,默认值为false,表示该事件是否冒泡。 "cancelable",可选,Boolean类型,默认值为fa...

kino2046的博客 4165

若依Vue整合积木报表实战:Token安全校验全流程解析

本文详细解析了在若依Vue后台系统中安全集成积木报表的全流程,重点阐述了Token安全校验的核心机制。通过前端菜单配置、Token传递、后端权限拦截及自定义Token服务实现,构建了一套完整的企业级报表访问安全防线,确保核心业务数据的安全可控。

t8u9v0的博客 577

关于事件委托的一个简单原理版EventManager,自己学会解耦合,不再迷惑

我们要的需求,B脚本发送一个事件调用A脚本,并且可以传参(不需要你可以删除参数),并且A和B解耦,那就需要用到中介者模式。EventManager 的主要目的是将事件的定义和处理集中在一个地方,以便更容易地跟踪和管理事件。EventManager 是一种更通用的事件管理系统,通常用于在整个项目中管理和触发事件。EventManager 可以包含许多不同类型的事件,可以在项目的多个脚本之间共享。

qq_42489774的博客 511

【UE 反射】反射的原理是什么?如何使用机制?

静态类型检查确保了类型的早期一致性和高效的代码执行,但减少了灵活性。动态类型检查提供了更大的灵活性,但增加了运行时的开销和潜在的错误。反射作为一种动态特性,无论是在静态类型语言还是动态类型语言中,都提供了强大的运行时类型操作能力,但也伴随着性能和安全性方面的权衡。通过理解这些联系,开发者可以在不同的编程语言和应用场景中选择适合的类型检查方式和反射机制,以实现所需的动态行为和灵活性,同时保证性能和安全性。

hhw_hhw的博客 6032

【Coppeliasim|轨迹规划(三)】机械臂逆解

文章目录一些设置导航点设置添加连接用于碰撞的设置代码实现终端输出 一些设置 导航点设置 关于如何添加设置 dummy 的细节建议参考官方手册,这里不再赘述。 添加连接用于碰撞的设置 按照序号点击(一个是机械臂,一个是所有的物体除了机械臂): 代码实现 getMatrixShiftedAlongZ=function(matrix,localZShift) local m={} for i=1,12,1 do m[i]=matrix[i] end

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

Java 创建事件(Event)、事件监听器(EventListener)、事件发布(publishEvent)详解和相关demo

监听器的作用在于允许你对应用程序中发生的事件做出响应,并执行相应的逻辑。使用 Spring 的事件机制,你可以将应用程序分解成更小、更易于管理的部分,并允许这些部分之间以解耦的方式进行通信。解耦:通过将事件发布和处理逻辑分离,使得应用程序的不同部分之间解耦。事件发布者不需要知道谁在监听事件,而监听器也不需要直接调用事件发布者的方法。这种解耦可以使得代码更加模块化和可维护。扩展性:当你需要在应用程序的不同部分之间引入新的交互或逻辑时,可以轻松地添加新的事件和监听器,而不会影响现有的代码。

m0_52767002的博客 5229

YOLO11全网首发:CVPR2026 Transformer注意力 | BinaryAttention 1-bit注意力,推理提速100%,超越FlashAttention2

本文改进:BinaryAttention 结合YOLO11的C3k2模块,全网首发创新。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 854

APAMA学习笔记(一) APAMA的安装与Hello world

摘要APAMA是一款用于处理高并发数据的软件,常应用于海量并发数据处理、高频交易系统、物联网、工业4.0等领域。APAMA是由德国SoftwareAG公司从1969年起开始的软件平台,主要目的是解决复杂、海量、并发的事件处理,与常见的编程语言c++,c#相比较,它是一种基于事件流的可编程体系。(以上全是废话,并没有什么卵用)简述本博从事量化交易软件开发,对多个平台做了比较,觉得APAMA的确是最适...

bigwriteshark的专栏 8592

PointNet++改进策略 :模块改进 | x-Conv | PointCNN, 结合局部结构与全局排列提升模型性能

这篇论文介绍了一种名为PointCNN的方法,旨在从点云(point cloud)数据中学习特征。传统卷积神经网络(CNN)在处理规则网格数据(如图像)时非常有效,但由于点云是无序且不规则的,直接在其上应用卷积操作会导致形状信息丢失,并对点的排列顺序敏感。为了解决这一问题,论文提出了一种X-Conv操作。该方法通过学习一种来重新排列点云中的点并加权输入特征。然后,将典型的卷积操作应用于转换后的特征。这种方法将传统的 CNN 扩展到点云特征学习,并命名为PointCNN。

u012901740的博客 2300

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

XiaoqiangClub的博客 7159

java 中的event_java 中的 event 的用法

/**a1.java**Createdon2008年11月22日,上午8:22**Tochangethistemplate,chooseTools|TemplateManager*andopenthetemplateintheeditor.*/packagetest;importjavax.swing.*;importjava..../** a1.java** Created on 2008年11...

weixin_36159662的博客 1326

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java —— 事件处理机制

一、Java事件主要角色 Source:事件源,即触发事件的对象; EventObject:事件对象,即带有 EventSource 信息的事件对象,是对EventSource的包装; Eventlistener:事件监听器,对该事件的处理。 说明: 1、Source:即任何具有行为的Java 对象,具有行为是为了能触发事件。 2、EventObject类: 继承关系:直接继承于Ob

永远的北极光 3万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java event事件_简单的Java Event-事件框架

自己写的一个简单的Java事件框架。目前具备以下功能:1.通过继承Event类,用户可自定义事件。2.通过EventService 的fireEvent(Event e) 发出一个事件。3.通过实现IEventHandler接口,监听某类事件。EventHandler可以动态注册到EventServer,也可以在配置文件中配置。4.通过实现IEventConsumedCallback接口,在事件被...

weixin_39611031的博客 2610

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

EventManager的两种简单实现方式

在进行unity相关开发过程中我们总是要响应很多事件,如果没有一个集中的管理,那么代码就会变得很混乱,这时EventManager就变得很需了。Unity事件管理器可以有两种方式实现,第一种是调用Unity的事件系统来进行封装,另一种可以使用C#的事件与委托机制实现,两种方式其实都很简单,也各有优缺点,具体的性能差异这篇文章已经总结的很好了http://blog.youkuaiyun.com/su9257/a

hcshen的博客 8043

java事件处理机制(自定义事件)

java中的事件机制的参与者有3种角色: 1.event object:事件状态对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中 2.event source:具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。 3.event lis...

weixin_33705053的博客 1063

java数据类型转换格式_Java基础语法_数据类型转换

数据类型转换当数据类型不一样时,将会发生数据类型转换。数据类型转换——自动转换(隐式)特点:代码不需要进行特殊处理,自动完成。规则:数据范围从小到大。System.out.println(1024);//这是一个整数,默认就是int类型。System.out.println(3.14);//这是一个浮点数,默认就是double类型。//左边是long类型,右边是int类型,左右不一样//一个等号代...

weixin_39619478的博客 324

JAVA的事件通知机制

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34179968的博客 1023

Java中常见的注解

Java中常见的注解 1、JDK自带的注解@Override  @Deprecated  @Suppvisewarnings 常见第三方注解 Spring:@Autowired  @Service  @Repository Mybatis:@InsertProvider  @UpdateProvider  @Options 注解的分类: 按照运行机制分:     源码注解:注解只

4383

Linux环境下搭建apama运行环境

1,首先su - work 切到非root用户下 2,到apama官网 http://www.apamacommunity.com/downloads/ 下载Linux版本的安装包 apama_10.1.0.3_amd64_linux.zip 上传到Linux服务器的application目录下并解压缩,得到文件夹apama_10.1.0.3_amd64_linux 3,创建一个/...

hikeboy的博客 1483
上一篇: Navicat premium 中 mysql 转 oracle
下一篇: SpringBoot 集成 cassandra 处理InvalidQueryException: unconfigured table
ZH_CS
博客等级 码龄15年 6粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZH_CS

随缘吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值