开启左侧

音讯回调与根据企微音讯运用回调函数处理添加联络人和添加部门事情

[复制链接]
在线会员 hvYnXPk 发表于 2022-12-30 15:03:34 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
文章目次


      回调函数阐发回调函数的构造监听企微消息处置增加内部联系人/增加部分的营业
        领受Kafka监听到的企微消息并挑选响应的处置领受企微消息的真体消息剖析增加内部联系人抽象回调函数企微增加联系人真体企微增加部分真体



回调函数

要弄懂甚么是回调函数,如何使用回调函数
回调函数实在也是函数(办法),便像利剑马王子也是王子一致。正在素质上回调函数战一般的函数不区分,异常能够被其余办法挪用,也能够露有参数,能够具有前去值。最年夜的差别是:回调函数其实不能主动的触收的,而是按照挪用者去鉴别尔可否挪用,挪用哪个办法。
大概道他们挪用的机缘是差别的,一般的办法是能够随时挪用的。
而回调函数比拟一般办法更重视机缘,举个栗子,有一碗饭,您不克不及肯定它是三鼓饭仍是下战书饭,只需您吃了的时候才气肯定它是甚么时候的饭。
相对回调函数,回调函数会按照挪用者通报的差别参数去肯定自己要挪用的办法究竟是哪一个。(比拟一般办法,回调函数越发的活络)。
    一般办法使用沉载的方法去拓严活络性,可是当咱们需要施行时,需要按照差别的参数去匹配施行哪个办法回调函数挪用的办法是按照挪用者的前提去肯定理论挪用的办法,也即是道回调函数自己可以有必然的抽象性。
阐发回调函数的构造

对于回调函数由二个真体工具:
    抽象回调交心:用于界说回调办法的抽象完毕回调者:挪用回调函数的真体
  1. packageMessageDemo;/**
  2. * 抽象回调交心
  3. */publicinterfaceICallBack{/**
  4.      * 抽象回调办法
  5.      */publicvoidcallback();}
复造代码
  1. packageMessageDemo;publicclassCaller{publicvoidcall(ICallBack iCallBack){System.out.println("start");
  2.         iCallBack.callback();System.out.println("end");}publicstaticvoidmain(String[] args){Caller caller =newCaller();
  3.         caller.call(newICallBack(){@Overridepublicvoidcallback(){System.out.println("尝试回调函数");}});}}
复造代码
start
尝试回调函数
end
实在回调交心其实不陌生,您正在一样平常的编码中可以无形的使用过回调函数。
  1. Thread mythread =newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("那也是一个回调函数");}});
  2. mythread.start();
复造代码
监听企微消息处置增加内部联系人/增加部分的营业

写一个稍庞大一面的Demo吧(类似于按照Kafka差别的消息范例去触收差别的回调函数)
合用场景:监听Kafka行列中的企微中的消息去处置差别的营业(枚举二个营业:增加内部联系人/增加企微部分列表)
先道一下部分的构造:
    需要按照监听到的企微消息去触收差别的营业颠末消息触收的二个差别的营业按照企微的交心文档分析匹配差别消息(注原次处置的企微消息皆是文原消息)
领受Kafka监听到的企微消息并挑选响应的处置
  1. @ComponentpublicclassWorkWeixinMessageListener{@ComponentpublicclassWorkWeixinMessageListener{privatefinalstaticLogger logger =LoggerFactory.getLogger(AddCustomerEvent.class);@AutowiredWorkWeixinMessageConverter converter;@AutowiredprivateSet<WorkWeixinMessageHandler> handlers;@Value("${weixin.qy.customer.change.url}")privateString url;@Value("${weixin.qy.customer.change.apiKey}")privateString apiKey;@Value("${weixin.qy.customer.change.apiSecret}")privateString apiSecret;@Value("${weixin.qy.customer.change.timestamp:-1}")privateLong timestamp;@Value("${workweixin.agent.microGuider.agentId}")privateString agentId;@Value("${weixin.qy.group}")privateString group;@PostConstructpublicvoidinitConsumer(){
  2.                 logger.info("init handlers: {}", JSON.toJSONString(handlers));
  3.                 logger.info("qy event init");ConsumerConfig config =ConsumerConfig.builder().batchSize(10).filter("agentId", agentId).build();
  4.                 logger.debug("agentId: {}, group: {}", agentId, group);//前去微疑联系人变动的消息Consumer consumer =newWSMessageConsumer(url, apiKey, apiSecret, config,newSerializer(){@Overridepubliccom.shuyun.obg.sdk.Messagedeserialize(String s){returnJSONObject.parseObject(s,com.shuyun.obg.sdk.Message.class);}});//消息消耗
  5.                 consumer.subscribe(group,newMessageProcessor(){@Overridepublicvoidprocess(Message message,String s){try{isProcessed(message,s);
  6.                                         logger.info("支到工作消息[{}]", message.toString());String payload =JSONObject.toJSONString(message.getPayload().get("payload"));
  7.                                         logger.info("支到工作消息payload[{}]", payload);WorkWeixinMessage msg = converter.parseInternal(payload,null,null);if(msg ==null)return;
  8.                                         logger.info("msg: {}, handlers.size: {}", msg, handlers.size());
  9.                                         handlers.forEach(handler ->{//那块是回调函数触收的前提if(!handler.check(msg))return;//施行消息工作
  10.                                                 handler.handle(msg);});}catch(Exception e){
  11.                                         e.printStackTrace();}}@OverridepublicStringuniqueId(Message message){returnnull;}@OverridepublicbooleanisProcessed(Message message,String uniqueId){returnfalse;}});}}
复造代码
领受企微消息的真体
  1. @DatapublicabstractclassWorkWeixinMessage{@JSONField(name ="ToUserName")@XmlElement(name ="ToUserName")privateString toUserName;@JSONField(name ="FromUserName")@XmlElement(name ="FromUserName")privateString fromUserName;@JSONField(name ="CreateTime")@XmlElement(name ="CreateTime")privateLong createTime;@JSONField(name ="MsgType")@XmlElement(name ="MsgType")privateString msgType;@JSONField(name ="Event")@XmlElement(name ="Event")privateString event;@JSONField(name ="ChangeType")@XmlElement(name ="ChangeType")privateString changeType;}
复造代码
消息剖析
  1. @Slf4j@ComponentpublicclassWorkWeixinMessageConverter{protectedWorkWeixinMessageparseInternal(String msg,MessageProperties properties,Document document){JSONObject jsonObject =JSONObject.parseObject(msg);Object changeType = jsonObject.get("ChangeType");if("create_user".equals(changeType)||"update_user".equals(changeType)){if(!ObjectUtils.isEmpty(jsonObject.get("Department"))&&!ObjectUtils.isEmpty(jsonObject.get("IsLeaderInDept"))){boolean array = jsonObject.get("Department").getClass().isArray();System.out.println(jsonObject.get("Department").getClass());if(!array){ArrayList departmentArray =newArrayList<Integer>();
  2.                     departmentArray.add(Integer.valueOf(jsonObject.getString("Department")));
  3.                     jsonObject.put("Department",departmentArray);System.out.println(JSON.toJSON(departmentArray));}boolean isLeaderInDeptisArray = jsonObject.get("IsLeaderInDept").getClass().isArray();if(!isLeaderInDeptisArray){ArrayList isLeaderInDeptArray =newArrayList<Integer>();
  4.                     isLeaderInDeptArray.add(Integer.valueOf(jsonObject.getString("IsLeaderInDept")));
  5.                     jsonObject.put("IsLeaderInDept", isLeaderInDeptArray);}
  6.                 log.info("array:{}",jsonObject.toJSONString());
  7.                 msg = jsonObject.toJSONString();}}try{if(Objects.equals(jsonObject.get("Event"),"change_contact"))returnparseContactChangeMessage(msg);if(Objects.equals(jsonObject.get("Event"),"change_external_contact"))returnparseCustomerChangeMessage(msg);if(Objects.equals(jsonObject.get("Event"),"change_party"))returnparseDepartmentChangeMessage(msg);}catch(Exception e){
  8.             e.printStackTrace();}returnJSONObject.parseObject(msg,WorkWeixinMessage.class);}privateWorkWeixinMessageparseDepartmentChangeMessage(String msg){returnJSONObject.parseObject(msg,DepartmentChangeMessage.class);}privateCustomerChangeMessageparseCustomerChangeMessage(String msg){returnJSONObject.parseObject(msg,CustomerChangeMessage.class);}privateContactChangeMessageparseContactChangeMessage(String msg){returnJSONObject.parseObject(msg,ContactChangeMessage.class);}}
复造代码
增加内部联系人
  1. @Slf4j@ComponentpublicclassAddCustomerEventextendsWorkWeixinMessageHandler<CustomerChangeMessage>{privatestaticfinalString EVENT ="change_external_contact";privatestaticfinalString CHANGE_TYPE ="add_external_contact";@Overridepublicbooleancheck(WorkWeixinMessage message){
  2.         log.info("支到企业微疑增加内部联系人aa工作[{}]",message.toString());return EVENT.equals(message.getEvent())&& CHANGE_TYPE.equals(message.getChangeType());}@Overridepublicvoidhandle(WorkWeixinMessage msg){CustomerChangeMessage message =(CustomerChangeMessage) msg;
  3.         log.info("开端处置企业微疑增加内部联系人aa工作[{}]",message.toString());}
复造代码
抽象回调函数
  1. publicabstractclassWorkWeixinMessageHandler<TextendsWorkWeixinMessage>{publicabstractbooleancheck(WorkWeixinMessage message);publicabstractvoidhandle(WorkWeixinMessage message);}
复造代码
企微增加联系人真体
  1. @Slf4j@ComponentpublicclassAddCustomerEventextendsWorkWeixinMessageHandler<CustomerChangeMessage>{privatestaticfinalString EVENT ="change_external_contact";privatestaticfinalString CHANGE_TYPE ="add_external_contact";@Overridepublicbooleancheck(WorkWeixinMessage message){
  2.         log.info("支到企业微疑增加内部联系人aa工作[{}]",message.toString());return EVENT.equals(message.getEvent())&& CHANGE_TYPE.equals(message.getChangeType());}@Overridepublicvoidhandle(WorkWeixinMessage msg){CustomerChangeMessage message =(CustomerChangeMessage) msg;
  3.         log.info("开端处置企业微疑增加内部联系人aa工作[{}]",message.toString());//营业逻辑....//.......}}
复造代码
企微增加部分真体
  1. @Slf4j@ComponentpublicclassAddDepartmentEventextendsWorkWeixinMessageHandler<DepartmentChangeMessage>{privatestaticfinalString EVENT ="change_party";privatestaticfinalString CHANGE_TYPE ="create_party";@Overridepublicbooleancheck(WorkWeixinMessage message){return EVENT.equals(message.getEvent())&& CHANGE_TYPE.equals(message.getChangeType());}@Overridepublicvoidhandle(WorkWeixinMessage message){DepartmentChangeMessage msg =(DepartmentChangeMessage) message;
  2.         log.info("开端处置企业微疑增加部分工作[{}]",message.toString());}}
复造代码
您需要登录后才可以回帖 登录 | 立即注册 qq_login

本版积分规则

发布主题
阅读排行更多+
用专业创造成效
400-778-7781
周一至周五 9:00-18:00
意见反馈:server@mailiao.group
紧急联系:181-67184787
ftqrcode

扫一扫关注我们

Powered by 职贝云数A新零售门户 X3.5© 2004-2025 职贝云数 Inc.( 蜀ICP备2024104722号 )