Messaging bridge je šikovné řešení, pokud potřebujeme distribuovat zprávy mezi několika messaging systémy. Potřeboval jsem vytvořit JMS bridge na WebLogicu a protože jsem si oblíbil WebLogic Scripting Tool (WLST), tak jsem si napsal skript.
Nicméně dnes, vás milí čtenáři, nechci odfláknout pouhým WLST skriptem, ale podíváme se na téma trochu zeširoka. Prvně si zasadíme JMS bridge do kontextu Enterprise Integration Patterns (EIP), pak se podíváme, jak jde bridge naklikat ve WebLogic konzoli. A samozřejmě vás neochudím o to WLST :-)
Messaging Bridge řeší následující problém: "How can multiple messaging systems be connected so that messages available on one are also available on the others?" Integrační vzory řeší problémy obecně. V tomto případě jde o to, jak dostat zprávy z jednoho systému na jiný. Např. jak dostat zprávy z WebSphere MQ na MSMQ. Nebo JMS. Nebo TIBCO Randevouz. Nebo... Jasný, ne? Odkudkoliv kamkoliv.
Messaging Bridge tedy je "a way for messages on one messaging system that are of interest to applications on another messaging system to be made available on the second messaging system as well."
Protože většinou neexistuje způsob, jak propojit dva různé messaging systémy, propojují se jednotlivé, odpovídající kanály na daných systémech. "The Messaging Bridge is a set of Channel Adapters ... where each pair of adapters connects a pair of corresponding channels. The bridge acts as a map from one set of channels to the other and transforms the message format of one system to the other."
JMS bridge běžně poskytují všichni dodavatelé JMS systémů, např.:
Zajímavým atributem u JMS bridge je Quality of Service (QoS), který říká, v jakém modu budou zprávy přeposílány:
Že nám bridge funguje, poznáme podle jeho stavu (záložka Monitoring) a taky doporučuju si nějakou zprávu cvičně přeposlat. Světe div se, ale transakce můžou zlobit.
Nicméně dnes, vás milí čtenáři, nechci odfláknout pouhým WLST skriptem, ale podíváme se na téma trochu zeširoka. Prvně si zasadíme JMS bridge do kontextu Enterprise Integration Patterns (EIP), pak se podíváme, jak jde bridge naklikat ve WebLogic konzoli. A samozřejmě vás neochudím o to WLST :-)
Messaging Bridge
Nebyl bych to já, kdybych se nevytasil s nějakým patternem. Tak tady je - Messaging Bridge, jak je definován v EIP. (Věty kurzivou jsou citacemi z knihy Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions.)Messaging Bridge řeší následující problém: "How can multiple messaging systems be connected so that messages available on one are also available on the others?" Integrační vzory řeší problémy obecně. V tomto případě jde o to, jak dostat zprávy z jednoho systému na jiný. Např. jak dostat zprávy z WebSphere MQ na MSMQ. Nebo JMS. Nebo TIBCO Randevouz. Nebo... Jasný, ne? Odkudkoliv kamkoliv.
Messaging Bridge tedy je "a way for messages on one messaging system that are of interest to applications on another messaging system to be made available on the second messaging system as well."
Protože většinou neexistuje způsob, jak propojit dva různé messaging systémy, propojují se jednotlivé, odpovídající kanály na daných systémech. "The Messaging Bridge is a set of Channel Adapters ... where each pair of adapters connects a pair of corresponding channels. The bridge acts as a map from one set of channels to the other and transforms the message format of one system to the other."
Vzor Messaging Bridge (zdroj EIP) |
JMS Bridge
JMS bridge je speciální variantou Messaging bridge, který má několik omezení, nebo spíše možná zjednodušení. Tři hlavní jsou:- Propojuje pouze JMS systémy (různých dodavatelů).
- Zprávy netransformuje (protože pracuje pouze s JMS zprávami).
- Zprávy z jednoho (zdrojového) systému přeposílá na jiný (cílový). Čili nečiní je pouze dostupnými, ale provádí routing/forwarding.
JMS bridge běžně poskytují všichni dodavatelé JMS systémů, např.:
Zajímavým atributem u JMS bridge je Quality of Service (QoS), který říká, v jakém modu budou zprávy přeposílány:
- At most once - nanejvýš jednou. Toto je nejbenevolentnější mod. Zpráva buď dorazí (maximálně jednou), anebo taky ne. A nám to tak vyhovuje.
- Duplicates OK - duplicity jsou v pořádku. V tomto modu jsou zprávy potvrzeny, že dorazily na cílový systém. Může se stát, že stejná zpráva nám dorazí ve více instancích, ale to je v pořádku - řekli jsme přece, duplicity jsou OK. Výhodou je, že se žádná zpráva neztratí.
- Exactly once - přesně jednou. Toto je nejvíc striktní mod, který nám nejen zaručuje, že každá zpráva dorazí na cílový systém, ale taky že tam dorazí právě jednou. Takový závazek není jen tak a zajistí nám ho JTA, čili distribuovaná transakce.
WebLogic JMS Bridge
Vytvoření JMS bridge na WebLogicu je otázkou chvilky, stačí mít připraveny správné ingredience. Co budeme potřebovat?- URL (a credentials) zdrojového serveru,
- URL (a credentials) cílového serveru,
- JNDI JMS adapteru (transakční, nebo netransakční)
- eis.jms.WLSConnectionFactoryJNDIXA
- eis.jms.WSLConnectionFactoryJNDINoTX
- JNDI Connection Factory,
- JNDI JMS destinace (fronty),
- Quality of Service
- Exactly-once
- Duplicate-okay
- Atmost-once
Pak už stačí jen naházet to do hrnce, zamíchat, podusit... a proklikat se průvodcem. Protože těch obrazovek ve wizardu je zbytečně moc, ukážu jenom screenshoty konečného stavu.
Pokud chceme použít transakční mod Exactly once, je dobré ještě před vytvářením bridge deployovat transakční adaptér jms-xa-adp.rar - vyhneme se tak zbytečným restartům (adapteru či WebLogicu). Adapter najdeme mezi knihovnami WebLogicu a nasazujeme ho jako aplikaci.
Bridge se sestává ze dvou destinací (zdrojové a cílové):
a samotného bridge:
Definice JMS bridge |
Že nám bridge funguje, poznáme podle jeho stavu (záložka Monitoring) a taky doporučuju si nějakou zprávu cvičně přeposlat. Světe div se, ale transakce můžou zlobit.
Stavy JMS bridgů (záložka Monitoring) |
WLST
No a máme tady velké finále, ke kterému jsem nenápadně, ale cílevědomě směřoval. Takže tady je: WLST v celé své pythoní kráse :-)# # properties # user = 'weblogic' password = 'welcome1' server = 't3://sandman:7001' # source credentials sourceJmsUser = 'weblogic' sourceJmsPassword = 'welcome1' sourceURL = 't3://sandman:7003' # target credentials targetJmsUser = 'weblogic' targetJmsPassword = 'welcome1' targetURL = 't3://sandman:7004' # JMS servers servers = ['SourceServer'] targets = [] # queues queues = [ 'EVM_EVE_CMS', 'EVM_EVE_FC', 'EVM_EVE_GEN', 'EVM_EVE_PTS', 'NTF_PARTY', 'NTF_PRODUCT'] adapterJNDI = 'eis.jms.WLSConnectionFactoryJNDIXA' connectionFactory = 'jms/sws/SWSConnectionFactory' qualityOfService = 'Exactly-once' jndiPrefix = 'jms/sws/' # connection connect(user, password, server) # edit mode edit() startEdit() # get targets for server in servers: targets.append(getMBean('/Servers/' + server)) print '\nTargets:', targets, '\n' # # create bridges # print '\n### Create bridges:\n' for queue in queues: bridgeName = queue + '_bridge' sourceName = queue + '_source' targetName = queue + '_target' # delete an old bridge ref = getMBean('/MessagingBridges/' + bridgeName) if ref != None: cd('/MessagingBridges') delete(bridgeName, 'MessagingBridge') # delete an old source destination ref = getMBean('/JMSBridgeDestinations/' + sourceName) if ref != None: cd('/JMSBridgeDestinations') delete(sourceName, 'JMSBridgeDestination') # delete an old target destination ref = getMBean('/JMSBridgeDestinations/' + targetName) if ref != None: cd('/JMSBridgeDestinations') delete(targetName, 'JMSBridgeDestination') # create a new source destination cd('/') cmo.createJMSBridgeDestination(sourceName) cd('/JMSBridgeDestinations/' + sourceName) cmo.setAdapterJNDIName(adapterJNDI) cmo.setConnectionFactoryJNDIName(connectionFactory) cmo.setConnectionURL(sourceURL) cmo.setDestinationJNDIName(jndiPrefix + queue) cmo.setUserName(sourceJmsUser) cmo.setUserPassword(sourceJmsPassword) print 'Source:', cmo # create a new target destination cd('/') cmo.createJMSBridgeDestination(targetName) cd('/JMSBridgeDestinations/' + targetName) cmo.setAdapterJNDIName(adapterJNDI) cmo.setConnectionFactoryJNDIName(connectionFactory) cmo.setConnectionURL(targetURL) cmo.setDestinationJNDIName(jndiPrefix + queue) cmo.setUserName(targetJmsUser) cmo.setUserPassword(targetJmsPassword) print 'Target:', cmo # create a new bridge cd('/') cmo.createMessagingBridge(bridgeName) cd('/MessagingBridges/' + bridgeName) cmo.setSourceDestination(getMBean('/JMSBridgeDestinations/' + sourceName)) cmo.setTargetDestination(getMBean('/JMSBridgeDestinations/' + targetName)) cmo.setStarted(true) cmo.setQualityOfService(qualityOfService) cmo.setTargets(targets) print 'Bridge:', cmo, '\n' # save and finish save() activate() disconnect() exit()
Žádné komentáře:
Okomentovat
Poznámka: Komentáře mohou přidávat pouze členové tohoto blogu.