




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第一章JMS概 JMS技術(shù)簡(jiǎn) JMS的相關(guān)概 JMS隊(duì) TLQ隊(duì) JMS隊(duì)列與TLQ隊(duì) JMS隊(duì)列限 Java消息服 JMS和其他企業(yè)級(jí)JavaAPI的關(guān) JMS點(diǎn)到點(diǎn)的消息模 JMS發(fā)布與訂閱模 JMS消息對(duì) JMS消息查 XA-JMS分布式事 概 XA的支 特別說(shuō) JMS1.1支持說(shuō) 命名服務(wù)(naming 服務(wù)(directory JNDI概 JNDI結(jié) JNDI在應(yīng)用服務(wù)器中的使 TongLINK/Q-JMS體系結(jié) 第二章客戶端參數(shù)配 系統(tǒng)參數(shù)配置格 參數(shù)配置說(shuō) 3JMS隊(duì)列定 JMS隊(duì)列定義格 隊(duì)列定義說(shuō) JMS...........................................................................................................................JMS格 說(shuō) 特別說(shuō) 第三章客戶端應(yīng) 集中通 集中通信參數(shù)配置舉 跨節(jié)點(diǎn)通 跨節(jié)點(diǎn)通信參數(shù)配置舉 配置說(shuō) 第四章客戶端系統(tǒng)日 錯(cuò)誤日志(TongCliBroker.sys)主要有 第五章JMS應(yīng)用開 TongLINK/Q_JMS的環(huán)境設(shè) TongLINK/Q_JMS設(shè)置不同類型的連 TongLINK/QJmsConnectionFactory構(gòu)造 通過(guò)指定主機(jī)名和端口構(gòu)造 利用tlkq協(xié)議名串構(gòu)造 JNDI配 TongJndi.Conf配置文 JMSAdmin.config配置文 JNDI對(duì) 子上下文的定 配置JNDI對(duì) 注意事 JNDI應(yīng) 標(biāo)準(zhǔn)JNDI屬性文 自定義JNDI屬性文 JNDI屬性文件說(shuō) 指定JNDI服務(wù) JNDI查 JNDIService名稱體系結(jié) JMS編 JMS 開發(fā)JMS的步 JMS中使用Session注意事 JMS客戶端程 第六章JMS應(yīng)用程序的編 消息發(fā) 普通方式發(fā)送程序流 JMS發(fā)送程序舉 消息接 JNDI方式接收程序流 特別說(shuō) JMS接收程序舉 JMS發(fā)送方事務(wù)流 JMS發(fā)送方事務(wù)程序舉 JMS接收方事務(wù)流 特別說(shuō) JMS接收方事務(wù)程序舉 JMS相關(guān)性流 JMS相關(guān)性程序舉 第七章 MDB簡(jiǎn) MDB特 MDB的實(shí) MDB的生命周 MDB示 MDB的部署描述 啟動(dòng) 啟動(dòng) 配置ConnectionFactory的JNDI 配置XAConnectionFactory的JNDI 配置queue的JNDI 查看配置的 啟動(dòng) 配置Foreign 配置Foreign 查看JNDI 編寫 編寫不需要支持的 編寫需要支持的 部署 Jbuilder部署 Weblogic控制臺(tái)部署 測(cè)試 JMSJMS技術(shù)簡(jiǎn)JMS本身不是一個(gè)通信軟件,而是一個(gè)標(biāo)準(zhǔn)的應(yīng)用編程接口(API),用來(lái)建立廠商中立一般稱為面向消息的中間件(Message-OrientedMiddleware,MOM。許多廠商目前都支持JMSIBMMQSeries、BEAWebLogicJMSserviceProgressSonicMQ,以及TongTech的TongLINK/Q(JMS客戶端支持JMS的1.1標(biāo)準(zhǔn))。傳遞的標(biāo)準(zhǔn)。就體系結(jié)構(gòu)而言,JMS與Java數(shù)據(jù)庫(kù)互連(JavaDatabaseConnectivity另一個(gè)JMS客戶機(jī)發(fā)送消息。知,這完全不同于基于RPC的(基于過(guò)程的)系統(tǒng),如EJB1.1、CORBA和JavaRMI的實(shí)現(xiàn)。在JMS中,客戶機(jī)將消息發(fā)送給一個(gè)虛擬通道(隊(duì)列),而其它JMS客戶機(jī)則預(yù)訂或這個(gè)虛擬通道。當(dāng)JMS客戶機(jī)發(fā)送消息時(shí),它并不等待回應(yīng),可以連續(xù)執(zhí)行JMS的相關(guān)概JMS隊(duì)TLQJMS隊(duì)列與TLQ隊(duì)JMS隊(duì)列限Java消息服Java消息服務(wù)(JavaMessageService)簡(jiǎn)稱JMS。JMS定義Java中消息中間件的接口。JMSJava統(tǒng)進(jìn)行通信。正如JDBC提供抽象的實(shí)現(xiàn)以關(guān)系數(shù)據(jù)庫(kù),JMS提供抽象的實(shí)現(xiàn)以消JMS和其他企業(yè)級(jí)JavaAPI的關(guān)也可直接調(diào)用JTA(JavaTransactionAPI)接口實(shí)現(xiàn)。發(fā)消息異步調(diào)用EJB組件。JMS點(diǎn)到點(diǎn)的消息模型 點(diǎn)到點(diǎn)(p2p)模JMS發(fā)布與訂閱模型 發(fā)布與訂閱(p/s JMSQueueConnectionFactory接口用于產(chǎn)生與消息傳遞系統(tǒng)中的隊(duì)列的連接。其屬性可由消息傳遞系統(tǒng)的系統(tǒng)管理員配置。一個(gè)作為隊(duì)列的接收方工作的MDB會(huì)綁定QueueConnectionFactory對(duì)象。EJBConnectionFactory中被稱為createConnection()的方法來(lái)為MDB創(chuàng)建Connection實(shí)例以與Queue通信。在JMS中的TopicConnectionFactory接口用于產(chǎn)生與消息傳遞系統(tǒng)中的的連接。與QueueConnectionFactory接口相似,其屬性可由消息傳遞系統(tǒng)的系統(tǒng)管理員配置。一個(gè)作為TopicMDBTopicConnectionFactory對(duì)象。EJB容器調(diào)用ConnectionFactory中被稱為createConnection()的方法來(lái)為MDB創(chuàng)建Connection實(shí)例以與Topic通信。JMS消息JMS中的一種類型對(duì)象,由消息頭(MessageHeader)、屬性(Properities)和消息體(Body)三部分組成。JMS消息消息頭用于消息分發(fā)字段,分發(fā)模式為持久和非持久。一些屬性如Priority,MessageID,CorrelationID,Type,Destination,Time-stamp,Replyto,Redelivered,Expiration。屬性(消息體創(chuàng)建一個(gè)TextMessage對(duì)象如下代碼: o,world!");創(chuàng)建一個(gè)ObjectMessage對(duì)象如下代碼:TextMessageString對(duì)象的封裝,文本對(duì)象傳遞時(shí)有用。假設(shè)許多消息系統(tǒng)是建立在XML上,TextMessage就成為包裝的容器。JMS消息查用 provider為每個(gè)消息分配的JMSMessageID message.getJMSMessageID()獲得 MessageID字符串,即corrid_stringXA-JMS分布式事概XAResourceX/Openjava映采用了javax.transaction.xa.XAResource對(duì)象的格式。JMS分布式事XA事務(wù)管理器JMSXA接口實(shí)現(xiàn)weblogic等應(yīng)用服務(wù)器下調(diào)用基于事務(wù)的消息驅(qū)動(dòng)BEAN以及其他關(guān)于Jms調(diào)用的sessionBean。特別說(shuō)明為了支持異步通信,J2EE1.3規(guī)范引入一種新的EJB類型:消息驅(qū)動(dòng)的Bean,簡(jiǎn)稱若使用JMS客戶端進(jìn)行消息傳輸,所安裝的jdk必須包含JMSjdk不包含JMS的相關(guān)JMS1.1支持說(shuō)JMS1.1兼容JMS命名 服務(wù)命名服務(wù)(naming服務(wù)(directory JavaNamingDirectoryInterfaceJNDIJNDIJava命名和接口。JNDI是一些標(biāo)準(zhǔn)API接口,Java程序通過(guò)這些API可以命名服務(wù)。JNDI的定義不依賴于任何獨(dú)立名服務(wù)器,對(duì)于各種命名服務(wù)器,都可通過(guò)統(tǒng)一的JNDI接口調(diào)用。JNDI Java命名 接口或JNDI提供了一個(gè)用于不同名 JNDIJavaJava消息服務(wù)EnterpriseJavaBeansJNDI JNDI JNDIJNDI (ServiceProviderInterface)Java應(yīng)用程序通過(guò)JNDIAPI各種命名服務(wù)。JNDISPI使得各種命名服務(wù)透明地加入到JNDIJNDILDAP、DNS、JNDI在應(yīng)用服務(wù)器中的使用應(yīng)用程序如何連接客戶端獲得JNDI對(duì)Java應(yīng)用程序使用perties配置文件連接客戶端 其中:1為客戶端所在機(jī)器的<initial-context-factory>tongtech.jms.jndi.JmsContextFactory</initial-context-TongLINK/QJMS系JMSP2P或P/SConnectionSession,它是P2P或P/S事務(wù)管理的基本結(jié)構(gòu)是MessageProducer和MessageConsumer。TopicQueue1所示:圖1.JMS類層次結(jié)構(gòu)NamingNamingService 第二章客戶端參數(shù)配配置,主要與客戶端進(jìn)程運(yùn)行性能相關(guān)的一些參數(shù);第二部分為JMS隊(duì)列定義。TongCliBroker.Conf配置文件格式um=TaskNum=MemBlocksNum=MemBlockSize=BlockSize=ListenQueueNum=DeadTime=JmsQueueName=JmsQueueType=TlqQueueName=系統(tǒng)參數(shù)配置系統(tǒng)參數(shù)配置格um=TaskNum=SessionPerTaskNum=MemBlocksNum=MemBlockSize=BlockSize=sValve=ListenQueueNum=DeadTime=參數(shù)配置說(shuō)明TaskNumJMS服務(wù)進(jìn)程為多任務(wù)模式,提高并發(fā)任務(wù)的個(gè)數(shù)可以提高性能。Default:1。Unx平臺(tái),啟動(dòng)客戶端后,啟動(dòng)客戶端的進(jìn)程個(gè)數(shù)為Taku1個(gè),中一客端管理程。數(shù)為TaskNum+1個(gè),其中一個(gè)線程為管理線程。發(fā)時(shí),SessionPerTaskNum*TaskNum*2的值必須小于 配置文件中um配置的值。這里的Session與JMSAPI的Session概念相同。Default:100。MemBlocksNumSessionblob數(shù)據(jù)成員的內(nèi)存塊,Default1(目sValve:客戶端閥值(性能優(yōu)化參數(shù))。當(dāng)客戶端的任務(wù)并發(fā)處理的session數(shù)sessionsession連接請(qǐng)求交給該任務(wù)ListenQueueNum:socket的等待隊(duì)列的大小向客戶端服務(wù)進(jìn)程申請(qǐng)任意服務(wù),則客戶端服務(wù)進(jìn)程將該連接強(qiáng)JmsQueueName=JmsQueueType=TlqQueueName=隊(duì)列定義說(shuō)明TlqQueueName:TongLINK/Q的隊(duì)列JMSJMS隊(duì)列對(duì)應(yīng)的JMSJMS格PubQueName=SubQueName說(shuō)ame:JMS名特別說(shuō)明第三章客戶端應(yīng)客戶端的結(jié)構(gòu)模在TongLINK/Q節(jié)點(diǎn)中,客戶端進(jìn)程負(fù)責(zé)與JMS客戶端的連接和通信的過(guò)程,但是實(shí)際上客戶端進(jìn)程借助TongLINK/Q傳輸進(jìn)程提供的TongLINK/Q消息隊(duì)列,來(lái)實(shí)JMS隊(duì)列實(shí)際上并不真正存在。使用時(shí)通過(guò)配置,JMS隊(duì)列被映射到TongLINK/Q隊(duì)列上??蛻舳诉M(jìn)程的結(jié)構(gòu)圖如下:JMSJMSJMSJMS特別說(shuō)明:JMS隊(duì)列和TongLINK/Q隊(duì)列的映射關(guān)系參見下面JMS客戶通信TongLINK/Q_JMS客戶通集中通信 JQ1JQ發(fā)送消息:當(dāng)客戶A通過(guò)JQ隊(duì)列發(fā)送消息時(shí),客戶端進(jìn)程根據(jù)JQ隊(duì)列的發(fā)送定義,將消息內(nèi)容放入TongLINK/Q隊(duì)列RcvQ中。接收消息:當(dāng)客戶B通過(guò)JQ1隊(duì)列接收消息時(shí),客戶端進(jìn)程收到客戶B接收消息的請(qǐng)JQ1TongLINK/Q隊(duì)列(RcvQ)中取出消息返回給客戶B。注意:集中通信參數(shù)配置舉例TongCliBroker.Conf配置如下:um=TaskNum=sValve=JmsQueueName=JQJmsQueueType=SendJmsQueueName=JQ1JmsQueueType=Recv注意:例中名為JQ和JQ1的Jms隊(duì)列都被映射到TongLINK/Q的接收隊(duì)列RcvQ跨節(jié)點(diǎn)通信收消息。此時(shí)JMS消息要利用TongLINK/Q跨節(jié)點(diǎn)之間的傳輸功能。消消消消消SendQ) 發(fā)送消息:JMS客戶A使用RJQ隊(duì)列發(fā)送消息時(shí),首先將消息發(fā)送給客戶端。客戶端找到RJQ的發(fā)送定義。根據(jù)配置,將消息放入發(fā)送隊(duì)列SendQ中。隨后TongLINK/Q將消息發(fā)送到Node2節(jié)點(diǎn)的RcvQ接收隊(duì)列中。戶端找到RJQ的接收定義。根據(jù)配置,不斷嘗試從接收隊(duì)列RcvQ中接收消息。當(dāng)收到消息后將消息內(nèi)容返回給客戶端B。注意:跨節(jié)點(diǎn)通信參數(shù)配置舉例TongCliBroker.Conf配置如下:um=TaskNum=sValve=JmsQueueName=RJQJmsQueueType=SendTlqQueueName=SendQTongCliBroker.Conf配置如下:um=TaskNum=sValve=JmsQueueName=RJQ1JmsQueueType=Recv配置說(shuō)明定義。同樣必須在節(jié)點(diǎn)Node2處配置RJQ1隊(duì)列的接收定義。JMSTongLINK/QNode2RJQ1隊(duì)列創(chuàng)建的接收定義映射到TongLINK/Q隊(duì)列(RcvQ)上??蛻舳说淖骺蛻舳顺洚?dāng)客戶端應(yīng)用程序和TongLINK/Q之間的客戶端收到來(lái)自客戶端應(yīng)用的消息請(qǐng)求后,調(diào)用TongLINK/QAPI執(zhí)第四章客戶端系統(tǒng)日第一條記錄的描述語(yǔ)句都是:“=========JmsServerTask[0]started=========”。錯(cuò)誤日志(TongCliBroker.sys)主要有:
E:[081914:08:41.163]:[\task.c:305]:[0,0,22,131]:task[f7b9b531]ofjmsserver運(yùn)行日志(TongCliBroker.log)主要有:
E:[0819 task.c:305]:task[f7b9b531]ofjmsserverto第五章JMS應(yīng)用開TongLINK/Q_JMS的環(huán)境設(shè)用JAVA消息服務(wù)。安裝TongLINK/Q(UNIX或WINDOWS)6.3標(biāo)準(zhǔn)版系統(tǒng),安裝方法請(qǐng)參考系統(tǒng) 下有下面與JMS相關(guān)的文件:Windows環(huán)境:java\lib\tlqadapter.jarUNIX環(huán)境:java/lib/tlqadapter.jarCLASSPATHJ2EE自帶的幾個(gè)文件:jms.jar、fscontext.jar、jndi.jar和TongLINK/Q_JMS設(shè)置不同類型的連接連接是和JMS服務(wù)器交互的點(diǎn),因此連接接口的每個(gè)實(shí)現(xiàn)必須知道如何與它自己的JMS服務(wù)器的一個(gè)實(shí)例連接。(publicConnection和ConnectionFactory的幾個(gè)實(shí)現(xiàn)的構(gòu)造TongLINK/QJmsConnectionFactory構(gòu)造通過(guò)指定主機(jī)名和端口構(gòu)造hostname:JMSStringhostname=“desthost”;Intport=10024;Stringhostname=“desthost”;Intport=10024;ConnectionFactorycf=newtlkq協(xié)議名串構(gòu)造tlkq:JMS通訊協(xié)議desthost:JMSIP10024:JMSStringurl=”tlkq://desthost:10024”;ConnectionFactoryStringurl=”tlkq://desthost:10024”;ConnectionFactorycf=newConnectionFactory(url);JNDI配置TongJndi.Conf配置文件TongJndi.Conf參數(shù)配置文件格式JndiType=NickName=Content=TongJndi.Conf參數(shù)配置說(shuō)明 JndiJndiType: Jndi類型。包括:Queue(隊(duì)列),Topic(),Factory(工廠。NickName: JNDI對(duì)象的別名。 JndiTypeFactoryJndiTypeQueue時(shí):JmsJndiType為Topic時(shí):JMS的名字特別說(shuō)明JMSAdmin.config配置文件在安裝了TongLINK/Q forJava之后,在Java\bin下找到JMSAdmin.config文件。該文件主要用來(lái)說(shuō)明Context的方式及地址,對(duì)應(yīng)于文件中的兩個(gè)參數(shù)INITIAL_CONTEXT_FACTORY和PROVIDER_URL。JMSAdmin.config參數(shù)配置文件格式JMSAdmin.config配置文件說(shuō)明 tongtech.jms.jndi.JmsContextFactoryTongLINK/QJms客戶端所有JNDI操作的根。它和INITIAL_CONTEXT_FACTORY一一對(duì)應(yīng)。PROVIDER_URL格式:用于LDAP 此參數(shù)有三個(gè)值,none(認(rèn)證、simple(簡(jiǎn)單認(rèn)證)和CRAM-MD5(認(rèn)JMSAdmin的啟動(dòng)可以在 %TLQHOMEDIR%\java\bin\JMSAdmin-cfg(其中“%TLQHOMEDIR%”為TongLINK/Q的系統(tǒng)安裝路徑JMSAdmin.config配置文件舉例JNDIConnectionFactory ConnectionFactory和Queue。 defineexamplecfConnectionFactoryConnectionFactory對(duì)象到examplecf defineq(exampleql)定義一個(gè)名exapeql的Queue對(duì)象,該對(duì)象使用名為Jmsque的jms隊(duì)列。即綁定Queue對(duì)象到exapeq名字上,通過(guò)exapeq名字指向可用的MS物理隊(duì)列名稱Jsque。copycopyq(exampleql)從命名exampleq1一個(gè)名字為q11的Queue綁定對(duì)象。-copycf(examplecf)從命名examplecf一個(gè)名字為cf1的ConnectionFactory綁定對(duì)象。即examplecf與cf1的對(duì)象相同。movemoveq(exampleql)改變Queue綁定對(duì)象名字exampleq1為q12。即exampleq1改名為q12子上下文的定義可以定義子上下文subcontext的操作。disyctx----顯示jndi綁定的上下文信息definectx(ctxname)--定義子上下文信息changectx(ctxname)--進(jìn)入子上下文信息changectx(=up) change delete ConnectionFactoryQueue對(duì)象。若需要有子上下文,則先定義其子上下文,JNDI對(duì)定義Queue對(duì) 假設(shè)客戶端的IP地址為22,端口為在TongLINK/Q安裝 java/bin下執(zhí)行JMSAdmin.bat; define定義Queue對(duì) defineq(tlqQueue)定義一個(gè)名為tlqQueue的Queue對(duì)象,該對(duì)象使用名為jmsque0Jms隊(duì)列[Jndi][JndiRecord]JndiType=FactoryNickName=tlqCFContent=CF[Jndi][JndiRecord]JndiType=QueueContent=jmsque0注意事項(xiàng)JNDI應(yīng)標(biāo)準(zhǔn)JNDI屬性文件件在環(huán)境CLASSPATH下。perties tlkq://desthost:10024/自定義JNDI屬性文件Importjavax.naming.*; //ForJNDIInterfacesImportjava.util.*;Importjava.io.*;Importjavax.jms.*;PublicclassJmsPropBind{PropertiesjndiProperties=null;Contextctx=null;Publicstaticvoidmain(String[]{JmsPropBindpm=new}publicJmsPropBind(String[]{jndiProperties=newProperties();if(args.length>0){{}catch(Exception}else{{}catch(Exception}ctx=new}privatevoidloadFromFile(StringfileName)throws{FileInputStreamfis=null;Try{Fis=newFileInputStream(fileName);}finallytry{fis.close();}catch(Exception}}privatevoidloadFromResourceBundle()throws{Stringkey=null;Stringvalue=null;ResourceBundlerb=ResourceBundle.getBundle("jndi");//propertiesfilenameEnumerationenum=rb.getKeys();While(enum.hasMoreElements()){Key=enum.nex Value=rb.getString(key);JndiProperties.put(key,value);}}JNDI屬性文件說(shuō)明如果傳入命令行參數(shù),則該代碼是限定特性文件名,并且按此方式調(diào)用類:JavaJmsPropBindc:\config\CLASSPATH上查找特性文件,因此有必要將包含該文件的放到類裝入JNDI屬性文件的兩種方法可以將屬性文件的名稱和位置作為命令行參數(shù)裝入。(調(diào)用loadFromFile(StringfileName)方法)jndijndi服可以將屬性文件作為資源束裝入。(loadFromResourceBundle方法)方式。資源束從類路徑裝入,代碼并不依賴于能夠JVM命有些組件(EJB組件)不能直接使用文件I/OJNDI服務(wù)Propertiesp=newProperties();Propertiesp=newProperties();p.put(“vider.url”,”tlkq://desthost:10024/”);InitialContextctx=newInitialContext(p);ConnectionFactorycf=(ConnectionFactory)ctx.lookup("mycf");ConnectionConnection=程序說(shuō)明:JNDIPublicConnectionFactorylookupConnectionFactory()Throwsjavax.naming.NamingException{ReturnPublicConnectionFactorylookupConnectionFactory()Throwsjavax.naming.NamingException{Return}publicQueuelookupQueue()throws{return}查詢說(shuō)明: (ConnectionFactory)ctx.lookup(“examplecf”)返回對(duì)象被強(qiáng)制轉(zhuǎn)換為 ”)JNDIService名稱體系結(jié) 客戶機(jī)代碼JNDIService中名為myQueue的名稱空間,而管理員可任一隊(duì)列目的地。也可以把特定的JMS供應(yīng)商的詳細(xì)信息隱藏于用來(lái)在JNDI中查詢名稱空間的簡(jiǎn)單名稱之后。這樣在JMS 客戶機(jī)與實(shí)際的JMS目的地之間設(shè)置一個(gè)間JMS規(guī)范將那些由管理員創(chuàng)建并且包含由JMS客戶機(jī)使用的配置信息的對(duì)象稱為JMS受管的對(duì)象JNDIJNDI名稱空間JMS編程JMSJMSPTPPub/SubConnectionFactory:創(chuàng)建ConnectionConnection:創(chuàng)建一個(gè)到消息系統(tǒng)目的地的連接Destination:消息的目的地JMS的步JNDIConnectionFactory用JNDI得到目標(biāo)隊(duì)列或?qū)ο?,即Destination對(duì)象ConnectionFactoryConnectionSessionMessageProducerJMS中使用Session注意事TLQ的JMSSession不是線程安全的對(duì)象,而且每一個(gè)Session實(shí)例對(duì)應(yīng)一個(gè)實(shí)際的TCPsocket連接。在使用的時(shí)候必須注意以下方面:SessionSession最多只能有一個(gè)線程訪一個(gè)特殊的場(chǎng)景是在MDB中使用Session:MDBEJB容器當(dāng)中運(yùn)MDB實(shí)例(也就是會(huì)產(chǎn)生多個(gè)線程)TLQJMS使用模式:SessionMDBMDB實(shí)例擁有Session。Session收/發(fā)消息要控制好session的數(shù)量。一個(gè)JMS應(yīng)用Session數(shù)量應(yīng)該有消息處理盡量使用同一個(gè)Session實(shí)例,Session使用完畢應(yīng)及時(shí)關(guān)閉。JMS客戶端程JMS的發(fā)送/接收消息程序//發(fā)送消息程序//GetthespecifiedconnectionfactoryandqueueContextjndiContext=newInitialContext();Destinationdestination=(Destination)//queue=(Queue)//CreatetheconnectionandConnectionconnection=factory.createConnection();Sessionsession=connection.createSession(false,//UsethesessionanddestinationtocreatetheproducerMessageProducerproducer=session.createProducer(Destination);//MessageProducerworkFlowproducer=session.createProducer((Destination)queue);message=session.createTextMessage("Amessagebody");returnproducer;//接收消息程序//GetthespecifiedconnectionfactoryandqueueContextjndiContext=newInitialContext();Destinationdestination=(Destination)//CreatetheconnectionandConnectionconnection=factory.createConnection();Sessionsession=connection.createSession(false,//UsethesessionanddestinationtocreatetheconsumerMessageConsumerconsumer=session.createConsumer(destination);//MessageConsumermc=return程序說(shuō)明創(chuàng)建一個(gè)創(chuàng)建一個(gè)到消息系統(tǒng)發(fā)送者的連接(Connection),通過(guò)使用一個(gè)和目標(biāo)隊(duì)列對(duì)象,通常用JDNI來(lái)指定:ContextjndiContext=newInitialContext();Destinationdestination=(Destination)jndiContext.lookup(destinationName);Connectionconnection=factory.createConnection();創(chuàng)建一個(gè)或多個(gè)ConnectionJMSSessionSessionJMSsendSessionconnect.createQueueSession(falseSession.AUTO_ACKNOWLEDGE);rcvSession=connect.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);MessageProducer用Session創(chuàng)建MessageProducerMessageConsumer。MessageProducerproducer=session.createProducer(destination);MessageConsumerconsumersession.createConsumer(destination);啟動(dòng)防止在初始化時(shí)發(fā)生不可預(yù)料的行為。一旦初始化結(jié)束,必須讓Connection啟動(dòng)消息創(chuàng)建一個(gè)消息發(fā)送者queue=(Queue)jndiContext.lookup("WorkFlowQueue");MessageProducerworkFlowProducer=null;workFlowProducer=session.createProducer((Destination)queue);message=session.createTextMessage("Amessagebody");消息接收者Queuequeue=session.createQueue("WorkFlowQueue");MessageConsumerconsumer=session.createConsumer(queue);message=consumer.receive(10000); txtmsg=(TextMessage)message;JMS的發(fā)布/訂閱消息程序//發(fā)布消息程序//GetthespecifiedconnectionfactoryandtopicContextjndiContext=newInitialContext();Destinationdestination=(Destination)//Topic=(Topic)//CreatetheconnectionandConnectionconnection=factory.createConnection();Sessionsession=connection.createSession(false,//UsethesessionanddestinationtocreatetheproducerTopicPublisherpublisher=session.createPublisher(topic);MessageProducerproducer=session.createProducer(Destination);//MessageProducerworkFlowproducer=session.createProducer((Destination)Topic);message=session.createTextMessage("Amessagebody");return//訂閱消息程序//GetthespecifiedconnectionfactoryandtopicContextjndiContext=newInitialContext();Destinationdestination=(Destination)//CreatetheconnectionandConnectionconnection=factory.createConnection();Sessionsession=connection.createSession(false,//UsethesessionanddestinationtocreatetheconsumerMessageConsumerconsumer=session.createConsumer(destination);//MessageConsumermc=returnconsumer;程序說(shuō)明:創(chuàng)建一個(gè)創(chuàng)建一個(gè)到消息系統(tǒng)發(fā)送者的連接(Connection),通過(guò)使用一個(gè)和目標(biāo)隊(duì)列對(duì)象,通常用JDNI來(lái)指定:ContextjndiContext=newInitialContext();Destinationdestination=(Destination)jndiContext.lookup(destinationName);Connectionconnection=factory.createConnection();創(chuàng)建一個(gè)或多個(gè)pubSession=connect.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);subSession=connect.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);MessageProducerSession創(chuàng)建MessageProducerMessageConsumer。MessageProducerproducer=session.createProducer(destination);MessageConsumerconsumersession.createConsumer(destination);啟動(dòng)防止在初始化時(shí)發(fā)生不可預(yù)料的行為。一旦初始化結(jié)束,必須讓Connection啟動(dòng)消息創(chuàng)建一個(gè)消息產(chǎn)生者topic=(Topic)jndiContext.lookup("WorkFlowTopic");MessageProducerworkFlowProducer=null;workFlowProducer=session.createProducer((Destination)topic);message=session.createTextMessage("Amessagebody");workFlowProducer.publish(message);消息使用者Topictopic=session.createTopic("WorkFlowTopic");MessageConsumerconsumer=session.createConsumer(topic);message=consumer.subscriber(10000); txtmsg=(TextMessage)message;第六章JMS應(yīng)用程序的編寫隊(duì)列有兩種創(chuàng)建方式:ConnectionFactory--Connection-Session-Queue消息發(fā)普通方式發(fā)送程序流程sendsendSessionMessageProducersend(Messagemessage,intmode,intprior,longtime)sendMessage(Destdest,Msgmsg,intmode,intprior,long時(shí)取值必須在1..10之間。JMS發(fā)送程序舉 importjavax.naming.Context;publicclass{publicstaticvoidmain(Stringargv[])throws{Stringmsgcontent=" oTongLinkjms";Sessionsession=null;Connectionc=null;MessageProducermpQueue=null;MessageProducermpTopic=ConnectionFactorycf=newtongtech.jms. c=session=c.createSession(false,Session.AUTO_ACKNOWLEDGE);Queuequeue1=session.createQueue("JmsQue1");mpQueue=session.createProducer(queue1);mpTopic=session.createProducer(topic1);BytesMessagemessage;message=session.createBytesMessage();}catch(Exception{}}
}}消息接JNDI方式接收程序流程Context--ConnectionFactory--Connection-Session-receive(long特別說(shuō)明receive(longtimeout)receiveNoWait()方法時(shí),可能使用receive(longtimeout)函數(shù)接收消息的方式,函數(shù)發(fā)出接收消息請(qǐng)求。timeout值比較小,消息較大,網(wǎng)絡(luò)速度較慢,或者此時(shí)隊(duì)列中沒(méi)消息時(shí),在timeout時(shí)間內(nèi)接收不到消息,函數(shù)退出。之后由服務(wù)器端發(fā)出的消息會(huì)到達(dá)JMS客戶端,在現(xiàn)的情況與receive(longtimeout)函數(shù)接收消息的方式相同。TongLINK/QJMS消息收發(fā)方式用戶使用現(xiàn)有版本,采用以下措施避免消息丟失:使用receive(longtimeout)JMS接收程序舉importjava.io.*;importjavax.jms.*;importjavax.naming.Context;publicclassQReceiver{Propertiesenv=newProperties();jndi=newInitialContext(env);staticContextictx=null;publicstaticvoidmain(Stringargv[])throws{Sessionsession=null; Connectionc=null;MessageConsumermcQueue=null;MessageConsumermcTopic=tryConnectionFactorycf=new .
factory=(ConnectionFactory)jndi.lookup(“cf”);c=cf.createConnection();session=qc.createSession(false,Session.AUTO_ACKNOWLEDGE);Queuequeue1=(Queue)jndi.lookup(“JmsQue1”);Topictopic1=(Topic)jndi.lookup(“JMam1”);mcQueue=session.createConsumer(queue1);mcTopic=session.createConsumer(topic1);message=(BytesMessage)mcQueue.receive();msgcontent=readBytesContent(message);}catch(Exceptionexc)}}消息發(fā)送事務(wù)JMS發(fā)送方事務(wù)流程sendsendSession--Session--XASessionXAResourcegetXAResourceXASessionSessiongetSessionXASessionXAResource來(lái)控制其事務(wù)性分配。XAResource將會(huì)send(Messagemessage,intmode,intprior,longtime)sendMessage(Destdest,Msgmsg,intmode,intprior,longJMS發(fā)送方事務(wù)程序舉例importjava.util.*;importjavax.jms.*;importpublicclassXAQSenderpublicstaticvoidmain(String[]args)throwsException QueuemyQueue=XAConnectionconnection=xaqcf.createXAConnection();XASessionxaSession=connection.createXASession();Sessionsession=xaSession.getSession();myQueue=session.createQueue("jmsque1");XAResourcexar=xaSession.getXAResource();MessageProducerqs=session.createProducer(myQueue);Stringstr;Xidxid1,xid2,xid3;//Firsttransactionxid1=newxar.start(xid1,XAResource.TMNOFLAGS);str=newString("date1:"+newDate());xar.end(xid1,//Secondtransactionxid2=newXid();xar.start(xid2,XAResource.TMNOFLAGS);str=newString("date:"+newDate());//Thirdtransactionxid3=newXid();xar.start(xid3,XAResource.TMNOFLAGS);str=newString("date:"+newDate());//Commitsecondtransactionmit(xid2,false);////Resumefirstxar.start(xid1,XAResource.TMRESUME);str=newString("date:"+newDate());mit(xid1,false);}}//消息接收事務(wù)JMS接收方事務(wù)流程Session--Session--XASessionXAResourcegetXAResourceXASessionSessiongetSessionXASessionXAResource來(lái)控制其事務(wù)性分配。receive(long特別說(shuō)明再通過(guò)XAResource操作JMS的事務(wù)。JMS接收方事務(wù)程序舉例importjava.util.*;importjavax.jms.*;importpublicclassXAQReceiverpublicstaticvoidmain(String[]args)throwsException QueuemyQueue=null;XAConnectionconnection=xaqcf.createXAConnection();XASessionxaSession=connection.createXASession();Sessionsession=xaSession.getSession();myQueue=session.createQueue("jmsque1");XAResourcexar=xaSession.getXAResource();MessageConsumerqr=session.createConsumer(myQueue);ObjectMessagemessage;//StarttheconnectionXidxid1,xid2;//Firsttransactionxid1=newmessage=(ObjectMessage)qr.receive();xar.end(xid1,XAResource.TMSUSPEND);//Secondtransactionxid2=newXid();message=(ObjectMessage)qr.receive();xar.end(xid2,XAResource.TMSUCCESS);mit(xid2,//Resumefirstmessage=(ObjectMessage)qr.receive();mit(xid1,false);}}//消息相關(guān)性JMS相關(guān)性流JMSCorrelationID QueueSession創(chuàng)建QueueSender列中的消息JMSCorrelationID沒(méi)有重復(fù)。JMS相關(guān)性程序舉例importpublicclassQSelectorpublicstaticvoidmain(Stringargv[])throws}privatestaticvoidqSelector_auto()Exception{StringmsgStr=" o,Iamamessageforselect";QueueConnectionqc=null;QueueSessionsession=null;QueueReceiverqr=null;QueueSenderqs;trynewtongtech.jms. .JmsConnectionFactory("",25000);qc=qcf.createQueueConnection();session=qc.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);Queuequeue=session.createQueue("JmsQue1");QueuequeueReply=session.createQueue("JmsQue2");qs=session.createSender(queue);message=/*message.setJMSDeliveryMode()*//*receive messageRcv=(ObjectMessage)}catch(Exceptionexc)}}privatestaticvoidqSelector()throwsStringmsgStr="o,Iamamessageforselect QueueConnectionqc=null;QueueSessionsession=null;QueueReceiverqr=null;QueueSenderqs;trynewtongtech.jms. qc=qcf.createQueueConnection();session=qc.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);Queuequeue=session.createQueue("JmsQue1");qs=message=/*}catch(Exceptionexc)}}MDB簡(jiǎn)介是不可見的。MDB是JMS系統(tǒng)的一部分,作為消費(fèi)者實(shí)現(xiàn)服務(wù)器上的商業(yè)邏輯程序。MDBBeanXMLEJB1.1規(guī)范中,定義了兩種類BeanBean的方法。MDBEJBJMSJMSAPI,MDBPub/SubP2P模型。。ContextinitialContext=newInitialContext(); MDB特征MDB是一個(gè)偵,不是一個(gè)過(guò)程調(diào)用組件MDB只能與一個(gè)Queue/TopicMDB的實(shí)MDB實(shí)現(xiàn)javax.ejb.MessageDrivenBeanjavax.jms.MessageListenerpublicinterfacepublicvoidsetMessageDrivenContext(MessageDrivenContextmdc);publicvoidejbCreate();publicvoid}MessageListener接口定義onMessage()MessageListener{publicvoid}MDB的生命周EJBMDB(not
MDB的生命周期圖容器調(diào)用newInstance()方法,用來(lái)對(duì)消息驅(qū)動(dòng)Bean進(jìn)行實(shí)例化容器調(diào)用eMesagDrenonx()方法并提供給MDB一個(gè)Mesagervenonet的實(shí)例。JMS客戶機(jī)(Java應(yīng)用程序、Bean或本地客戶機(jī))發(fā)送的任何消息,將由消息路由當(dāng)一條消息被發(fā)送給一個(gè)消息驅(qū)動(dòng)Bean時(shí),EJB容器就會(huì)從池中選擇消息Bean實(shí)例來(lái)當(dāng)消息驅(qū)動(dòng)BeanonMessage()方法時(shí),它就會(huì)接收到這條消息。一旦這條Bean的onMessage()方法返回時(shí),消息驅(qū)動(dòng)Bean實(shí)例即返回到池中并準(zhǔn)備處理另一個(gè)消息。onMessage()方法對(duì)消息作語(yǔ)法分析并將操作委托給業(yè)務(wù)邏輯層,例如會(huì)話Bean。若容器需要減少池的大小或服務(wù)器關(guān)閉,則在實(shí)例丟棄時(shí)對(duì)實(shí)例調(diào)用ejbRemove()方MDB示例{privateMessageDrivenContextpublicmyMessageBean(){} no-argdefaultconstructorpublicvoidejbActivate(){ EJBspeclifecyclepublicvoidejbRemove(){mdbContext=null; EJBspeclifecyclecontrolpublicvoidejbPassivate(){}// EJBspeclifecyclecontrol settheMDBpublicvoidsetMessageDrivenContext(MessageDrivenContextctx){mdbContext=ctx;}ejbCreate() throwsCreateException{} EJBspeclifecyclecontrol publicvoidonMessage(Messagemsg)try{//ensurenoExceptionsescapetocontainerTextMessagetmsg=(TextMessage)msg;Stringtext=tmsg.getText();System.out.println(“myMessageBean:“+text}catch(Exceptione){// catchALLexceptionse.printStackTrace(); // // //classMDB的部署描述符ejb- -<transaction-type>Container</transaction- //<destination-type>javax.jms.Queue</destination-type>// JMS<JMSServerName=“myJMSServer”MDB集成到應(yīng)用程序中器JMSMDB集成到應(yīng)用程序的典型方法。MDB提供一個(gè)標(biāo)準(zhǔn)方法以創(chuàng)建語(yǔ)法分析和處理的邏輯。在典型情況下,MDBEJB數(shù)情況下為會(huì)話Bean。MDB。此設(shè)計(jì)模式能夠提高組件的重用使用。即MDB僅作為應(yīng)用程序的接口進(jìn)行工作。第八章Weblogic上的應(yīng)修改Weblogic的啟動(dòng)修改weblogic相應(yīng)域的啟動(dòng)startWebLogic.cmd,以便讓weblogic能夠TongLINK/Q的類庫(kù)。如想使用my1域,該域?qū)?yīng)的路徑為 1 ECHO@REMWARNING:ThisfileiscreatedbytheConfiguration@REMAnychangestothisscriptmaybelostwhenaddingextensionstothisconfiguration.@REMThisscriptisusedtostartWebLogicServerforthe inthe@REMcurrentworkingdirectory.ThisscriptsimplysetstheSERVER_NAME@REMvariableandstartsserver.@REMTocreateyourownstartscriptforyour ,allyouneedtosetis@REMSERVER_NAME,thenstartstheserver.@REMOthervariablesthatstartWLStakes@REMWLS_USER -cleartextuserforserverstartup@REMWLS_PW -cleartextpasswordforserverstartup@REMPRODUCTION_MODE -trueforproductionmodeservers,falsefor@REMdevelopmentmode@REMJAVA_OPTIONS-Javacommand-lineoptionsforrunningtheserver.(These willbetaggedontotheendoftheJAVA_VMandMEM_ARGS)@REMJAVA_VM -ThejavaargspecifyingtheVMtorun.(i.e.-server, -hotspot,@REMMEM_ARGS -Thevariabletooverridethestandardmemoryarguments passedtojava@REMConsoleOnlineHelp(http:\\ @REMInitializethecommonenvironment.setfor%%iin("%WL_HOME%")dosetWL_HOME=%%~fsisetPRODUCTION_MODE=setset@REMCallcommEnvhereAFTERsettingthejava_vendortogetcommonenvironmentalcall@REMSetSERVER_NAMEtothenameoftheserveryouwishtostartup.setSERVER_NAME=myserversetTLKQ_ROOT @REMCallWebLogicServerecho.echoechoechoechoecho***************************************************echo*TostartWebLogicServer,useausernameand*echo*passwordassignedtoanadmin-leveluser.For*echo*serveradministration,usetheWebLogicServer*echo*consoleathttp:\\[hostname]:[port]\console*echo -- 啟動(dòng)啟動(dòng)TongLINK/Q前,必須配置好需要的隊(duì)列和TongLINK/Q參數(shù)。在配置文件TongUser.Conf中,重要的系統(tǒng)參數(shù)配置為: 其他配置請(qǐng)參見TongLINK/Q6.2系統(tǒng)管理手冊(cè)第三章。在配置文件TongCliBroker.Conf中,對(duì)系統(tǒng)參數(shù)和JMS隊(duì)列的具體配置請(qǐng)參見第三章 啟動(dòng)啟動(dòng)JmsAdmin如下:配置ConnectionFactoryJNDI名為:myCF:配置XAConnectionFactory的JNDI配置queueJNDI查看配置的啟動(dòng)ConfigureanewForeign配置ForeignJMSConnection查看JNDI編寫編寫不需要支持的如果不需要管理,則該mdb的transaction-type應(yīng)該配置為Bean類型,并且使packageimportjavax.ejb.*;importjavax.jms.*;packageimportjavax.ejb.*;importjavax.jms.*;{MessageDrivenContextmessageDrivenContext;publicvoidejbCreate()throwsCreateException{}publicvoidejbRemove()}publicvoidonMessage(Message{System.out.println(" TextMessagetm
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 不銹鋼表面除蠟施工方案
- 2025北京東城高二(上)期末生物(教師版)
- 突發(fā)事件處置方案
- 地下室不銹鋼水池施工方案
- 紫葉矮櫻嫁接繁育技術(shù)關(guān)鍵要點(diǎn)全面深入探討與闡述
- 四川省眉山市洪雅縣洪雅縣2024-2025學(xué)年九年級(jí)上學(xué)期期末考試物理試題(原卷版+解析版)
- 室外弱電整修施工方案
- 綠色金融與可持續(xù)投資的策略
- 工業(yè)碳減排與綠色制造的策略及實(shí)施路徑
- 思維可視化視域下高中英語(yǔ)課堂讀后續(xù)寫教學(xué)策略研究
- 2025年安徽港航集團(tuán)所屬企業(yè)招聘13人筆試參考題庫(kù)附帶答案詳解
- 2025年南昌理工學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)帶答案
- 光伏2021施工上崗證考核答案
- 2025年內(nèi)蒙古交通職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)含答案
- 2025年度未成年人監(jiān)護(hù)權(quán)轉(zhuǎn)移協(xié)議書模板
- 2025年湖南鐵道職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及答案1套
- GB/T 45241-2025公務(wù)用車管理平臺(tái)數(shù)據(jù)規(guī)范
- 2025年中國(guó)文創(chuàng)產(chǎn)品行業(yè)發(fā)展策略、市場(chǎng)環(huán)境及前景研究分析報(bào)告
- 林木采伐安全協(xié)議書范本
- 招聘技巧話術(shù)培訓(xùn)
- 第九章 壓強(qiáng) 單元練習(xí)(含答案)-2024-2025學(xué)年人教版物理八年級(jí)下冊(cè)
評(píng)論
0/150
提交評(píng)論