工作流使用RabbitMQ推送代辦

配置文件:
pom文件:

<spring-rabbit.version>1.7.2.RELEASE</spring-rabbit.version>
<amqp-client.version>3.6.1</amqp-client.version>
<rabbit.mq.address></rabbit.mq.address>
 <rabbit.mq.userName>guest</rabbit.mq.userName>
<rabbit.mq.password>guest</rabbit.mq.password>            

Properties文件幻锁,properties引用pom中的配置:
wfpt.properties:
wfpt.rabbitmq.address=${rabbit.mq.address}
wfpt.rabbitmq.userName=${rabbit.mq.userName}
wfpt.rabbitmq.password=${rabbit.mq.password}
 wfpt.rabbitmq.virtualHost=${rabbit.mq.virtualHost}

RabbiitMQ使用的模式:

工作流中使用的是Routingkey 模式,但是沒有指定Exchange的類型和名稱辽幌,當(dāng)Exchange沒有指定類型和名稱時(shí)巡社,RabbitMQ將會(huì)為每一個(gè)隊(duì)列設(shè)定一個(gè)Default Exchange,它的Routing key為消息隊(duì)列的名稱奋构。見下圖:

RabbitMQ生產(chǎn)者:ActRabbitMQProducer
RabbitMQ消費(fèi)者:ActRabbitMQConsumer
控制是否推送代辦:(發(fā)起流程時(shí)壳影,是否推送待辦)

IActPushTODOService中的isPushTODO(DelegateTask delegateTask)方法,該方法根據(jù)流程變量中是否存在isPushTODO變量來決定是否推送待辦弥臼。
RabbitMQ與KafKa的切換:(狀態(tài)模式的使用)

1.      控制使用的消息中間件的類型:ActTodoTaskMQManager宴咧,根據(jù)配置文件中wfpt.todoTask.sendType的配置的類型和數(shù)據(jù)庫中act_ex_system表的pushType的值來判斷使用的消息中間件是哪個(gè)。

2.     狀態(tài)接口ActTodoTaskMQState径缅,RabbitMQ和KafKa發(fā)送方法共同實(shí)現(xiàn)該接口掺栅。

3.     ActRabbitMQTodoTaskService和ActKafkaTodoTaskService方法時(shí)發(fā)送代辦的實(shí)現(xiàn)類

4.  實(shí)際調(diào)用形式:                 

1.  ActTodoTaskMQManager mqManager = new ActTodoTaskMQManager();

2.  ActTodoTaskMQState state = mqManager.getMQState();

3.  state.sendTodoMsgAndUpdateTodoTask(distributeTaskDTO,todoTaskList);

系統(tǒng)說明:

(1)pom文件依賴:

  <!-- RabbitMQ -->

<spring-rabbit.version>1.7.2.RELEASE</spring-rabbit.version>

 <amqp-client.version>3.6.1</amqp-client.version>

 <!-- 工作流服務(wù)(開發(fā)環(huán)境) -->

<wfpt.version>0.0.5-SNAPSHOT</wfpt.version>

 <!-- RabbitMQ start -->

 <dependency>

<groupId>org.springframework.amqp</groupId>

 <artifactId>spring-rabbit</artifactId>

 <version>${spring-rabbit.version}</version>

 </dependency>

 <dependency>

 <groupId>com.rabbitmq</groupId>

<artifactId>amqp-client</artifactId>

 <version>${amqp-client.version}</version>

  </dependency>

 <!-- RabbitMQ end -->

 <!-- 工作流服務(wù)wfpt start -->

 <dependency>

 <groupId>com.yixin</groupId>

 <artifactId>wfpt-rpc</artifactId>

 <version>${wfpt.version}</version>

</dependency>

 <!-- 工作流服務(wù)wfpt end -->
(2)xml配置文件:rpc-impl層箱吕,spring-context.xml

1.  <!-- RabbitMQ接收待辦:請(qǐng)注意默認(rèn)是不啟用狀態(tài),否則有可能產(chǎn)生消費(fèi)了別人待辦的消息  -->

 <bean id="ActRabbitReceiveTodoTaskMessage"

 class="com.yixin.wfpt.api.todotask.rabbitmq.ActRabbitReceiveTodoTaskMessage" init-method="init">

 <property name="queueName" value="sample"/>

 <property name="initFlag" value="true"/>

 <property name="receiveClass" value="com.yixin.demo.todotask.ActExDemoTodoTaskServiceImpl"/>

 </bean>

說明:ActRabbitReceiveTodoTaskMessage類是上面所講的接收待辦的客戶端柿冲,工作流deploy的時(shí)候會(huì)把該類deploy到nexus茬高,sample會(huì)依賴到該類

ActExDemoTodoTaskServiceImpl類是業(yè)務(wù)系統(tǒng)接收待辦的實(shí)現(xiàn)類,該類由業(yè)務(wù)系統(tǒng)實(shí)現(xiàn)假抄,該類實(shí)現(xiàn)了接口IActExDemoTodoTaskService怎栽,該接口是工作流提供的接口

  1. 接收待辦的客戶端

ActRabbitReceiveTodoTaskMessage類

 public void init(){

  if(initFlag){

 logger.info("接收待辦,連接RabbitMQ開始宿饱!");

 if(!StringUtils.hasText(queueName)){

  logger.info("RabbitMQ接收待辦消息,傳入?yún)?shù)queueName為空熏瞄!");

 return ;

 }

 logger.info("RabbitMQ接收待辦消息,queueName為:{}",queueName);

 if (queueName.endsWith(",")) {

 logger.info("RabbitMQ接收待辦消息,queueName以逗號(hào)結(jié)尾谬以,不符合規(guī)范强饮,queueName={}",queueName);

 return;

 }

 if(queueName.indexOf(',') > -1){

 String[] queues = queueName.split(",");

 for(String queue : queues){

  consumeMsg(queue);

 }

 }else{

  consumeMsg(queueName);
 }
 }
 }

說明:

(1) init方法是在業(yè)務(wù)系統(tǒng)spring-context.xml文件中配置的init-method="init",在業(yè)務(wù)系統(tǒng)啟動(dòng)的時(shí)候而且是initFlag為true的時(shí)候執(zhí)行該方法。

(2) 支持多個(gè)隊(duì)列为黎,以逗號(hào)分隔邮丰。queueName指的是接入系統(tǒng)的名稱,該出配置的queueName需要與工作流頁面中接入系統(tǒng)的編碼一樣铭乾。

 private void consumeMsg(String queue){

 try {

 /**

* 創(chuàng)建channel

 */

  final Channel channel= ActRabbitMQConsumer.createChannel();

 /**

 * 聲明隊(duì)列

 */

 channel.queueDeclare(queue,true,false,false,null);
  channel.basicConsume(queue,false,newQueueingConsumer(channel){

  @Override

  public void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] bodys) throws IOException{

  String message = new String(bodys);

 List<TodoTaskDTO> todoTaskList = parseMessage(message);
 execute(todoTaskList);
  channel.basicAck(envelope.getDeliveryTag(),false);
 }
 });

 }catch(Exception e) {

  logger.error("RabbitMQ消費(fèi)者接收消息失敿袅!", e);

  throw new BzException("RabbitMQ消費(fèi)者接收消息失斂婚荨斗蒋!");

  }

 }

說明:該方法用于接收消息,basicConsume(queue,false,new QueueingConsumer())中第二個(gè)參數(shù)表示是否自動(dòng)確認(rèn)笛质,此處為false表示手工確認(rèn)泉沾。手工確認(rèn)的方法為:channel.basicAck(envelope.getDeliveryTag(),false);

handleDelivery方法是監(jiān)聽器監(jiān)聽消息,如果RabbitMQ中存在消息則接收消息妇押。

execute方法用applicationContext.getBean的方式跷究,實(shí)現(xiàn)IActExDemoTodoTaskService接口的方法,receiveClass就是現(xiàn)實(shí)IActExDemoTodoTaskService接口的方法舆吮。

  1.  IPushTodoTaskAPI接口:
    

該接口時(shí)工作流提供的接口揭朝,但是由業(yè)務(wù)系統(tǒng)去實(shí)現(xiàn)該接口。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末色冀,一起剝皮案震驚了整個(gè)濱河市潭袱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锋恬,老刑警劉巖屯换,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡彤悔,警方通過查閱死者的電腦和手機(jī)嘉抓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晕窑,“玉大人抑片,你說我怎么就攤上這事⊙畛啵” “怎么了敞斋?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)疾牲。 經(jīng)常有香客問我植捎,道長(zhǎng),這世上最難降的妖魔是什么阳柔? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任焰枢,我火速辦了婚禮,結(jié)果婚禮上舌剂,老公的妹妹穿的比我還像新娘济锄。我一直安慰自己,他們只是感情好架诞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布拟淮。 她就那樣靜靜地躺著干茉,像睡著了一般谴忧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上角虫,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天沾谓,我揣著相機(jī)與錄音,去河邊找鬼戳鹅。 笑死均驶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枫虏。 我是一名探鬼主播妇穴,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼隶债!你這毒婦竟也來了腾它?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤死讹,失蹤者是張志新(化名)和其女友劉穎瞒滴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妓忍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年虏两,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片世剖。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡定罢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旁瘫,到底是詐尸還是另有隱情引颈,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布境蜕,位于F島的核電站蝙场,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏粱年。R本人自食惡果不足惜售滤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望台诗。 院中可真熱鬧完箩,春花似錦、人聲如沸拉队。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粱快。三九已至秩彤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間事哭,已是汗流浹背漫雷。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳍咱,地道東北人降盹。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谤辜,于是被迫代替她去往敵國和親蓄坏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 15,892評(píng)論 2 11
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理丑念,服務(wù)發(fā)現(xiàn)涡戳,斷路器,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 來源 RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器渠欺。支持消息的持久化妹蔽、事務(wù)、擁塞控...
    jiangmo閱讀 10,351評(píng)論 2 34
  • 利用RabbitMQ集群橫向擴(kuò)展能力,均衡流量壓力胳岂,讓消息集群的秒級(jí)服務(wù)能力達(dá)到百萬编整,Google曾做過此類實(shí)驗(yàn);...
    有貨技術(shù)閱讀 3,458評(píng)論 0 1
  • 背景 靜態(tài)網(wǎng)站托管(s3website)相比普通s3請(qǐng)求乳丰,多了幾個(gè)核心功能: 默認(rèn)請(qǐng)求頁面掌测。當(dāng)用戶url以"/"結(jié)...
    宋新穎閱讀 2,577評(píng)論 0 0