RabbitMq開發(fā)入門資料_第1頁
RabbitMq開發(fā)入門資料_第2頁
RabbitMq開發(fā)入門資料_第3頁
RabbitMq開發(fā)入門資料_第4頁
RabbitMq開發(fā)入門資料_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

目錄

1資產(chǎn)管理模塊JavaBean..................................2

2Mq生產(chǎn)者和消費(fèi)者........................................4

2.1自定義發(fā)送類................................................................4

2.2send類(producer)........................................................................................................................5

2.3監(jiān)聽類(consumer)........................................................................................................................6

3Mq的配置文件詳解........................................7

3.1連接配置...................................................................7

3.2重試策略和消息轉(zhuǎn)換器.......................................................8

3.3定義queue和交換機(jī).........................................................8

3.4監(jiān)聽器注冊(cè)和隊(duì)列配對(duì).......................................................9

4初始化開發(fā)環(huán)境(內(nèi)網(wǎng))....................................9

4.1Git拉取遠(yuǎn)程倉庫項(xiàng)目........................................................9

4.2如何修改項(xiàng)目名............................................................10

4.3Maven倉庫的修改..........................................................12

4.4注意事項(xiàng)..................................................................12

1資產(chǎn)管理模塊JavaBean

熟悉hap開發(fā)或者ssm開發(fā)的,會(huì)很熟悉,根據(jù)模塊來建包,例如資產(chǎn)管理模塊ast,其

中dto、service%mapper、controllers是典型的mvc開發(fā)模式,方便后期維護(hù)。

▼?java

▼EScom.hand.his

ito根據(jù)Mybatis對(duì)象關(guān)系映射的規(guī)則編寫dto類

▼Blast

Elcontrollersmapper一般維承Mapper〈DTO>即可

▼Eldto

QPurContractStoreHeadservice業(yè)務(wù)接口由于繼承工BaseService故可以使

QPurContractStoreLlne用框架自帶的增刪改查也行

▼EHmapper

OPurContractStoreHeadMapper

?PurContractStoreLineMapper

▼Diservice

▼aimp!

?PurContractStoreHeadServicelmpI

0PurContractStoreLineServicelmpI

?IPurContractStoreHeadService

?IPurContractStoreLineService

2發(fā)送原理:

MQ的發(fā)送消息的方式這里主要介紹topic模式

Q1

P代表消息發(fā)送者,x代表交換機(jī),Q1和Q2代表隊(duì)列,C1和C2代表消息的接收者。

消息的發(fā)送經(jīng)歷三個(gè)步驟:

第一步是發(fā)送消息時(shí)指定接收消息的交換機(jī)exchange;

2

JSONObj?ctj*on-MVJS0N0bj?ctO:

j?<?.put("data*,si):_

JSOCLput("isXeedResponse*.true)]

json.put(*reque*tldv,1001):

String*3-json.toJSGKStrincO;

Sytte*.out.println(r<..................1111;

Systra.out.println(13):

SrstM.out...............■—》.);

〃?碼〔

aASE64Encod?rba??MEncod?r-neBASEMEncoderO;

Stringencode-ba??MEncod?r.?0(0<1?(*3.getBytesCcharwtNamr

?end?r<o?pofMnta.stndMess?<?(EXCHANGE,ROUTER,encod*);

catch(Exceptione)(

假設(shè)圖中的encode就是我們要發(fā)送的消息,需要傳入的前兩個(gè)參數(shù)分別是交換機(jī)名和

routingkey,而它調(diào)用的sendMessage方法可如下圖:

■port?rt.sprintfreaevork.MQP.core.AaQpTrapHte:

or,.eprincfraBmrk.b??nt.factory,annotation.Autovired;

rtorg.?prin?frMWvor*i.ttereotyp*.Co?pon?nt;

cUttM*a>M?S?nd?rCoapon?nt?(

privateAaqpT?apl?t<??qpTtipUtt;

publicvoi4??odtttiMfe(Stringexchann.Stringrwittr,Stri?g?????)(

■Mu>T?w)let?.convertAnd$?nd(?xchann<rout”,■????<?>;

于此同時(shí)隊(duì)列已經(jīng)和交換機(jī)綁定了對(duì)應(yīng)的routingkey,于是第二步就是交換機(jī)通過

routingkey找到接收消息的queue,也就是找到隊(duì)列,從而向其發(fā)送消息;

第三部是接收者收消息,要收消息接收者只要指定監(jiān)聽的哪一個(gè)隊(duì)列,就可以從哪一個(gè)隊(duì)

列中獲取消息。

2.1Topic模式

在rabbit:bindings標(biāo)簽里pattern代表routingkey,在這里也可以用通配符*和#,*

代表一個(gè),而#號(hào)則可以代表多個(gè),例如pattern="*.test”表示可以匹配交換機(jī)名為

“1.test”和"2.test”,“3.test”等等的,而pattern="也test”則可以匹配如"1.test”,

3

“21.lesl”,“1322.lesl”等等之類的。只要在這里綁定了之后發(fā)數(shù)據(jù)其實(shí)就是

直接調(diào)用.AmqpTemplate類下的convertAndSend(exchange,router,message)方法而己,

這里的變量,前兩個(gè)要指定為配置文件里的routingkey和隊(duì)列名,后面的就是要發(fā)送的消

息。

3Mq生產(chǎn)者和消費(fèi)者

Mq發(fā)送方即producer,接收方?(監(jiān)聽方)即consumer,可以按照功能模塊進(jìn)行分模塊處理,

也可以,下面有三個(gè)包,分別為components、controllers、listnser,即消息的發(fā)送模版類、

發(fā)送、接收,可以自定義包名,一般發(fā)送和接收要分開來寫,符合開發(fā)規(guī)范。

■1java

▼KBcom.hand.hl$

components自定義message的發(fā)送工具類

?Blast

▼DirabbitMq

controllers發(fā)i]Json信息是producer

▼Bicomponents

QMessageSenderComponents

listener進(jìn)行持久化處理、異常處理

▼Bicontrollers

QMessageSenderController

▼Ellistener

QContractLineLstener

QContractListener

0MessageConfrmCallBackListener

?MessageRetuinCallBackListener

3.1自定義發(fā)送類

利用AmqpTemplate的重載方法convertAndSendO方法,進(jìn)行mq的發(fā)送,這個(gè)方法里有

三個(gè)參數(shù),分別是exchange、router>message,即交換機(jī)、routing-key^json數(shù)據(jù)串。

在不同的功能里,有需要響應(yīng)或者發(fā)送的就可以在無應(yīng)的producer類里注入該類,然后

調(diào)用sendMessageO方法即可。

4

eM-g-omp?!?j--

packagecom.hand.his.rabbitMq.components;

Himportorg.springframevork.amqp.core.AmQpTemplate:

importorg.springframework.beans,factory,annotation.Autowired;

Zimportorg.springframework,stereotype.Component;

QComponent

publicclassMessageSenderComponents{

?Autovired

privateAmqpTempla:eamQpTemplate;

publicvoidsendMessage(Stringexchange.Stringrouter.Stringmessage){

amqpTemplate.convertAndSend(exchange,router,message):

AUKRDy、JOUIIJ1

3.2send類(producer)

以下面的發(fā)送為例。

首先定義兩個(gè)常量EXCHANGE、ROUTER,即交換機(jī),routing-key。(注意:要在mq的配置

文件里配置)見下圖。

V!一交換機(jī)一>

<!~

交次機(jī):一個(gè)交換機(jī)可以娟定多個(gè)隊(duì)列,一個(gè)隊(duì)列也可以娜定到3個(gè)交決機(jī)±

如果沒有隊(duì)列蜴定到交換機(jī)上.R1發(fā)送到諼交換機(jī)上的信息則會(huì)丟失

direct模式:消息與一個(gè)特定的躋由叁完全匹配,才會(huì)晴發(fā)

topic模式:技段則轉(zhuǎn)發(fā)消息?靈活

—>

<rabblt:topic-exchangeid="ftXnaao?exchange?test"na?e=MRXngan.exchange.test**durable=Mtrue*'auto-delete='f:>

<rabbit:bindings>

<rabbit:bindingpattern^"sed*'queue,'fijjHifljj-queue_test,,/>

</rabbit:bindings>

7?ebbiI;lu/11y具

<rabbit:bindingpattern=Msod"qucuc="pinganqueuetestw/>

這個(gè)是為交換機(jī)綁定routing-key,一個(gè)交換機(jī)可以綁定多個(gè)routing-key,其中pattern屬

性就是routing-key,queue屬性就是queue。

5

package*coo.hand.his.rabbitMq.ccotroll^rs;

isport...

?Controller

Publicclass■飆出Sen如敘1以公班(

privatefinalStringEXCHVXE**pmiAn.exchange.test將exchange和router定義為?!鲆允瓜率揭?/p>

privatefinalStringROC7ER**sed>:

privateLoggerlogger?LogierFactory.r^r^wHgetClassO):

privateMtssageSenderCcapoTMntssend*rCooponents;IEA**11定義的發(fā)達(dá)關(guān)公在下用,。n-$3£。()

privateIPurContractStoreHetdServiceheadS*rvic?;一汴入業(yè)務(wù)類▼面“加長衰戍的增副改介的方法用門^override的方法

?RequestMappingCrabbitns(.send*)

requestMapplng可以方便前端Utff]或自己兩試

^ResponseBody

publicStringf9ndO(

Li$t<PurContractStoreH^id>purContractStoreHeads-headServic^.0;

fo|(inti?0;i<pur€ontractStor^<cads.siz?();j44)(

//Stringsiss?JSONCbject.toJSOSStringCpurContractStoreHeads.get(i)):

Z/JSONObJectJson0b.eet■JSOKObject.perseObJectfJSONObject.toJS(^<purContrACtStoreHeads.get(i)).toStringO):

//Strings=JsonObject.toStringO;

Stringsi-JSCAObjcct.ro/SttUpurContractStoreHeads.get(i>).toStrirgO:

s9nderCoopon?nts.serdMessag?(EXCHV?CE.ROUTER.3D;send方法體計(jì)對(duì)不同的業(yè)務(wù)需求“的

logger,info(sl):

j做是將從數(shù)據(jù)用出家的J?Q復(fù)合忖犢或Json對(duì)世法A;發(fā)送金之內(nèi)

機(jī).由到印wu。

return*HelloRabbitMq!*:

3.3監(jiān)聽類(consumer)

監(jiān)聽類要在mq配置文件里注冊(cè),監(jiān)聽類與queue有關(guān),因?yàn)楸O(jiān)聽收到的json數(shù)據(jù),會(huì)以

message的方式傳到監(jiān)聽類里,然后對(duì)其進(jìn)行處理。

<!一定義queue—>

49el-

sedurable是否持久化

51exclusive僅創(chuàng)建者可以使鹿的私有隊(duì)列,斷開后自動(dòng)■除

52auto-delete當(dāng)所有消弱建連接新開后,是苦自動(dòng)■!除隊(duì)列

53->

<rabbit:queueideMDinqaaQueuetestid"na?e=,,DloqaDqueuetest"durable:"true"auto-delete=a,falseMexclusive^"4alse,7>

注意;這里的queue和發(fā)送方定義的queue是一樣的。

一般收到j(luò)son數(shù)據(jù)以后,如果發(fā)送方對(duì)json數(shù)據(jù)進(jìn)行了加密或者編碼,則在收到j(luò)son

數(shù)據(jù)以后,要先對(duì)json數(shù)據(jù)進(jìn)行解密或者解碼,然后在對(duì)■其進(jìn)行json數(shù)據(jù)轉(zhuǎn)換。

6

?publicvoidonMessdge(MessageDtssage,Channelchannel)th-Exception(

JSONObjectj£QQffiu£Cl-null;

try(

oessage.getMessas^ocvrti?s().s?tCcntentTyp?(*appHcationjson*);將技校跑伯息更中&置為J?on:2

lotB*r.info(*c?tah7dBtssage:*?Dossag??*fr?channtl:**channel:;

Objectobj-Dassas^Ccnv9rtor.frosM?5?>£e(xws$a£Q);■將轉(zhuǎn)換或Java財(cái)象

jsonObject?JSOX.roJSttV$rrw(obj));格J―川我轉(zhuǎn)換成J/on咐效

//getdataandtransfertoJavaObject

PuiContracxSxoreHeadMad-JSOX.toJavaObJecz(JsonObject.PurConxractStoreHead.class):將Jan"W.

//reoo^'eidfieldincaseduplicateerror

bead.setPurchas?<ontr8CtHead!d(null):■&Kxd為null¥-AAH91Mlsequence

〃savetodatabaseandg6tanewid

PuKontractStoreHead{urContractStoreHead■h?adServ£ce.insertSelective:iRcqucst:null,head):a|*

lofger.debug(aReceiveaDessageparsetojson:{|*.puxContractStoreHead)

Icatch(Exceptionc)?

loftsor.Qrror(*Sca?error:*.?);

//errorSrvico.?tvoError<**.?):如果存ft鼻常信息9日定義一個(gè)“rvis

String—Body?*xx>*?>.setUessag^O:

//■aiIS*rvic*.s^ndMaiKa?ssateBody.*r^c^iv9r*?*proj*ct*.*cc*):

If(jsonObjecx!■null){

nessageSenderCoapawnTs.sendMessage(exchange:-wxchan?。",router*ropic*.JaonObJect.toJSONStrlnf()):

〃必須手動(dòng)ack才能將潸息從仄列中W抻

channel.basicAck(Dessage.o?tMessageProperties().getDeliveryTMO*&false):f動(dòng)KIMIIl

I

4Mq的配置文件詳解

4.1連接配置

這是mq配置文件的最基本和重要的配置,其中包括host:mq服務(wù)器的ip,userrame:

用戶,password:密碼,virtual-host:虛擬機(jī)。

消息確認(rèn)監(jiān)聽器;是發(fā)送方用來監(jiān)聽json數(shù)據(jù)是否發(fā)送到交換機(jī)。見下圖。

publicclassMessageConfirmCallBackListenerimplementsRabbitTemplate.ConfirmCallback{

privateLoggerlogger=LoggerFactory.getLogger(getClass());

11

(aOverride

publicvoidconfirm(CorrelationDatacorrelationData,booleanb,Strings){

if(b){

15//只確認(rèn)生產(chǎn)者消息發(fā)送成功,消費(fèi)者是否處理成功不做保證

logger.deoug("發(fā)送消息到exchange手工回應(yīng);

}else{

18//只確認(rèn)生產(chǎn)者消息發(fā)送成功,消費(fèi)者是否處理成功不做保證

logger,debug(“消息未發(fā)送到交換機(jī)”);

20)

21i>

22)

消息退回監(jiān)聽器:是發(fā)送方用來監(jiān)聽json數(shù)據(jù)是否從oxchango路由到queue。見下圖。

publicclassMessageReturnCallBackListenerimplementsRabbitTemplate.Returncallback{

privateLoggerlogger=LoggerFactory.getlogger(getClass());

11

?Override

publicvoidreturnedMessage(Messagemessage,inti,Strings,Stringsi,Strings2){

logger,debug("exchange到queue不成功,回調(diào)return..;

15,}

16

7

<context:property-placeholderlocation-"classpath:config.propertit$*/>

。一連接配置一〉

<!一消息確認(rèn)監(jiān)聽器一〉

<beanid-*confirtoCallBackListener*classec<mhand.his.rabbitMq.1.stener.MessageConfirtoCal!BackListenerV>

<:一消息退回監(jiān)聽器一》

<b^anid-rtturnCalIBackListtntr*classcom.hand.his.rabbitMQ.listtntr.MossdgeReturnCallBackListtntr*/^

<!一rabbit連接配置一〉

<rabbit:connection-factoryid-*connectionFactory*

publisher-confirms='true*

publisher-returns-*true*

host^^localhost*_RabbitMq股務(wù)器ip

username-Mfinance*

virtual-host="pa*J虛擬機(jī)叫用戶最細(xì)粒度的權(quán)限

password_*finance.001*

port**5672*/>

4.2重試策略和消息轉(zhuǎn)換器

消息轉(zhuǎn)換器,要在mq配置文件里定義,這里用的是spring整合mq的消息轉(zhuǎn)換器。

<1一■試策略一)

<b?anid**r?tryTesplat?*class**org.sprintfraserork.rttry.supp<

<properxy"beckOffPolicy*>

<be?nclass''?rg.spuntfranrrork.retry,backoff.Exp:

<propertynoi>?-'initialIntan-al-valur--5O0*/>

《propertynaue*iuitipner*value-iu.uV?

<propertynane-*a*xlnt?rval*value-*10000a/>

</bw>

</property>

</boan>

<!―消息婢展器.白格式一

<beanidJacksonSJsonMessAgcCon.crtcrclass

。一通il指定下面的adzin信息.當(dāng)拿produc.r中的“chant?粒會(huì)在rabbitnqfi務(wù)b上自動(dòng)生或

<r?bbit:ediinCCOMCXlon*factarp*co?MCti?Nctory*A

4.3定義queue和交換機(jī)

不管是發(fā)送方還是接收方,都要配置queue,發(fā)送方要配置exchange、routing-key,接

收方要配置queue,因?yàn)榘l(fā)送方和接收方配置了相同的連接配置.(見3.1),所以,mq服務(wù)器會(huì)

跟據(jù)配置文件,把發(fā)送方數(shù)據(jù)>exchange>routing-key>queue>監(jiān)聽類。

48<!―^xQueue—>

49<!-

5?durable是否持久化

51exclusive僅創(chuàng)建臺(tái)可以使用的私府隊(duì)列,斷開后自就副球

52auto-delete當(dāng)所有加重端連發(fā)新開后,是苦自動(dòng)■!除隊(duì)列

口一>

<rabbit:queueid?*DlttQan_Queue_testid"naa^^fiinoao-Queue-testMdurablerwauto-dele—“exclusive?wfalseM/>

<!一交渙機(jī)

57<!一

58交推機(jī):一個(gè)交投機(jī)可以解定S個(gè)隊(duì)列,一個(gè)隊(duì)則也可以墀定到多個(gè)交接機(jī)上

59如果沒有隊(duì)列■定到交帙機(jī)上.照發(fā)送到該交換機(jī)上的信息JN會(huì)長笑

6e

61direct模式:簿息與一個(gè)特定陲由b究至匹髭,才會(huì)找發(fā)

62topic般式:接雙則耨發(fā)消息,■艮送

63—>

<rabblt:topic-exchangeid11oAnaan.exchange,testHna?e=Holnflao.exchange.test"durable^:ueauto-delete=Mfalse">

<rabbit:bindings>

<rabbit:bindingpattern?,,sedMqueueMpAfiqafi_Queue_test,,/>

</rabbit:bindings>

</rabbit:topic-exchange〉

8

4.4監(jiān)聽器注冊(cè)和隊(duì)列配對(duì)

監(jiān)聽類,即寫在listener包里的,要在配置文件里注冊(cè),然后在設(shè)置監(jiān)聽類與隊(duì)列配對(duì)。

〈beanxdclass

〈beanidclass-

<rabbit:listener-container

connection-factory-

iwssate-converter'

acknowledte,nanual

<rabbit:listener

queues-rplnaaD-Q1

ref-*contractHea.

<rabbit:listener

queues-*pingan_qi

ref->contractLin-

</rabbit:Hsten?r-cootain?r>

5初始化開發(fā)環(huán)境(內(nèi)網(wǎng))

由于平安是內(nèi)網(wǎng)環(huán)境,很多事情沒有操作的權(quán)限,例如鏈接遠(yuǎn)程倉庫下載Jar包依賴,對(duì)

于這種情況,需要由有經(jīng)驗(yàn)的開發(fā)人員先確定好將來開發(fā)過程會(huì)使用到的依賴,避免在開發(fā)過

程中多次更新項(xiàng)目結(jié)構(gòu),減緩項(xiàng)目的實(shí)施進(jìn)度。

5.1Git拉取遠(yuǎn)程倉庫項(xiàng)目

BefdctorguildRunloohVCSlWindowHelp

springappli<otionC1nrMHktnry?Tomcat0.5.11▼A€

/VCSOperationsPopup...Alt*'

JCommit...CtrUK

/UpdateProject...CtrUT

-a-Pfo/ci...

RefreshFileStatus

手ShowLocalChangesasUMLCtrl*Alt-Shlft*D

Rt,

3CreatePatek.\+AddCtrHAIt*A

ApplyPatch...\八…、1?

ApplyPatchfiomClipboard...ShowCurrentRevision

己ShelveChanges...:Comparewithth6SameRepositoryVersion

ChectoutfromVersionControl?^omporewith...

ImportintoVersionControl?ComparewithBranch…

BrowseVCSRepository?Q)ShowHbtOfY

^ynr?與Revert...CtrkAtt?Z

ResolveConflicts...

GotoFileCtrl+Sh

PBranches-CtrkShift*'

RecentFilesCtrl+ETag...

匕MergeCharges...

NavigationBarAltStashChanges...

UnSushChanges...

Dropfilesheretoc5ResetHEAD..

Remotes.^

/ML.

ZPush...Ctrl?$hift*K

Rebme...

9

SearchEverywhereDoubleShift

Droptilesheretoopen

iicloneH

5.2如何修改項(xiàng)目名

共需5步

①在idea里右擊項(xiàng)目名選擇Refactor—>Rename

②修改項(xiàng)目pom.xml的兩處,見下圖

<?xmlversion-^*1.0*encoding--ITF-8*?>

<projectxmlns^-http:naven.apache.org/POM/4.0.0

xalns:xsia*http://www.w3.org/2001/XMLSch<

xsi:schemaLocation-*http:/xaven.apache.(

<?odelVersion>4.0.0</modelVersion>

<groupld>com.hand.hls</groupld>

<artifactId>pazg<.artifactld>

<version>l.0.O-RELE.ASE</version>

<packaging>war</packaging>

<build>

<finalName>pazg</final\ame>

〈plugins)

plugin

<groupld>org.apache,maven.plugins</groupld>

<artifactld>maven-war-plugin</ar:ifactld>

<configuration>

③重新生成war

10

nProjectStructure

4-+

Name:pazg:war

6pazg:war

ProjectSettings

pazg:warexploded

Project

Outputdirectory:D:\Projects\pazg\t.

Modules

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論