海馬汽車股份3jms for tonglinkq63管理與開發手冊_第1頁
海馬汽車股份3jms for tonglinkq63管理與開發手冊_第2頁
海馬汽車股份3jms for tonglinkq63管理與開發手冊_第3頁
海馬汽車股份3jms for tonglinkq63管理與開發手冊_第4頁
海馬汽車股份3jms for tonglinkq63管理與開發手冊_第5頁
已閱讀5頁,還剩83頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第一章JMS概 JMS技術簡 JMS的相關概 JMS隊 TLQ隊 JMS隊列與TLQ隊 JMS隊列限 Java消息服 JMS和其他企業級JavaAPI的關 JMS點到點的消息模 JMS發布與訂閱模 JMS消息對 JMS消息查 XA-JMS分布式事 概 XA的支 特別說 JMS1.1支持說 命名服務(naming 服務(directory JNDI概 JNDI結 JNDI在應用服務器中的使 TongLINK/Q-JMS體系結 第二章客戶端參數配 系統參數配置格 參數配置說 3JMS隊列定 JMS隊列定義格 隊列定義說 JMS...........................................................................................................................JMS格 說 特別說 第三章客戶端應 集中通 集中通信參數配置舉 跨節點通 跨節點通信參數配置舉 配置說 第四章客戶端系統日 錯誤日志(TongCliBroker.sys)主要有 第五章JMS應用開 TongLINK/Q_JMS的環境設 TongLINK/Q_JMS設置不同類型的連 TongLINK/QJmsConnectionFactory構造 通過指定主機名和端口構造 利用tlkq協議名串構造 JNDI配 TongJndi.Conf配置文 JMSAdmin.config配置文 JNDI對 子上下文的定 配置JNDI對 注意事 JNDI應 標準JNDI屬性文 自定義JNDI屬性文 JNDI屬性文件說 指定JNDI服務 JNDI查 JNDIService名稱體系結 JMS編 JMS 開發JMS的步 JMS中使用Session注意事 JMS客戶端程 第六章JMS應用程序的編 消息發 普通方式發送程序流 JMS發送程序舉 消息接 JNDI方式接收程序流 特別說 JMS接收程序舉 JMS發送方事務流 JMS發送方事務程序舉 JMS接收方事務流 特別說 JMS接收方事務程序舉 JMS相關性流 JMS相關性程序舉 第七章 MDB簡 MDB特 MDB的實 MDB的生命周 MDB示 MDB的部署描述 啟動 啟動 配置ConnectionFactory的JNDI 配置XAConnectionFactory的JNDI 配置queue的JNDI 查看配置的 啟動 配置Foreign 配置Foreign 查看JNDI 編寫 編寫不需要支持的 編寫需要支持的 部署 Jbuilder部署 Weblogic控制臺部署 測試 JMSJMS技術簡JMS本身不是一個通信軟件,而是一個標準的應用編程接口(API),用來建立廠商中立一般稱為面向消息的中間件(Message-OrientedMiddleware,MOM。許多廠商目前都支持JMSIBMMQSeries、BEAWebLogicJMSserviceProgressSonicMQ,以及TongTech的TongLINK/Q(JMS客戶端支持JMS的1.1標準)。傳遞的標準。就體系結構而言,JMS與Java數據庫互連(JavaDatabaseConnectivity另一個JMS客戶機發送消息。知,這完全不同于基于RPC的(基于過程的)系統,如EJB1.1、CORBA和JavaRMI的實現。在JMS中,客戶機將消息發送給一個虛擬通道(隊列),而其它JMS客戶機則預訂或這個虛擬通道。當JMS客戶機發送消息時,它并不等待回應,可以連續執行JMS的相關概JMS隊TLQJMS隊列與TLQ隊JMS隊列限Java消息服Java消息服務(JavaMessageService)簡稱JMS。JMS定義Java中消息中間件的接口。JMSJava統進行通信。正如JDBC提供抽象的實現以關系數據庫,JMS提供抽象的實現以消JMS和其他企業級JavaAPI的關也可直接調用JTA(JavaTransactionAPI)接口實現。發消息異步調用EJB組件。JMS點到點的消息模型 點到點(p2p)模JMS發布與訂閱模型 發布與訂閱(p/s JMSQueueConnectionFactory接口用于產生與消息傳遞系統中的隊列的連接。其屬性可由消息傳遞系統的系統管理員配置。一個作為隊列的接收方工作的MDB會綁定QueueConnectionFactory對象。EJBConnectionFactory中被稱為createConnection()的方法來為MDB創建Connection實例以與Queue通信。在JMS中的TopicConnectionFactory接口用于產生與消息傳遞系統中的的連接。與QueueConnectionFactory接口相似,其屬性可由消息傳遞系統的系統管理員配置。一個作為TopicMDBTopicConnectionFactory對象。EJB容器調用ConnectionFactory中被稱為createConnection()的方法來為MDB創建Connection實例以與Topic通信。JMS消息JMS中的一種類型對象,由消息頭(MessageHeader)、屬性(Properities)和消息體(Body)三部分組成。JMS消息消息頭用于消息分發字段,分發模式為持久和非持久。一些屬性如Priority,MessageID,CorrelationID,Type,Destination,Time-stamp,Replyto,Redelivered,Expiration。屬性(消息體創建一個TextMessage對象如下代碼: o,world!");創建一個ObjectMessage對象如下代碼:TextMessageString對象的封裝,文本對象傳遞時有用。假設許多消息系統是建立在XML上,TextMessage就成為包裝的容器。JMS消息查用 provider為每個消息分配的JMSMessageID message.getJMSMessageID()獲得 MessageID字符串,即corrid_stringXA-JMS分布式事概XAResourceX/Openjava映采用了javax.transaction.xa.XAResource對象的格式。JMS分布式事XA事務管理器JMSXA接口實現weblogic等應用服務器下調用基于事務的消息驅動BEAN以及其他關于Jms調用的sessionBean。特別說明為了支持異步通信,J2EE1.3規范引入一種新的EJB類型:消息驅動的Bean,簡稱若使用JMS客戶端進行消息傳輸,所安裝的jdk必須包含JMSjdk不包含JMS的相關JMS1.1支持說JMS1.1兼容JMS命名 服務命名服務(naming服務(directory JavaNamingDirectoryInterfaceJNDIJNDIJava命名和接口。JNDI是一些標準API接口,Java程序通過這些API可以命名服務。JNDI的定義不依賴于任何獨立名服務器,對于各種命名服務器,都可通過統一的JNDI接口調用。JNDI Java命名 接口或JNDI提供了一個用于不同名 JNDIJavaJava消息服務EnterpriseJavaBeansJNDI JNDI JNDIJNDI (ServiceProviderInterface)Java應用程序通過JNDIAPI各種命名服務。JNDISPI使得各種命名服務透明地加入到JNDIJNDILDAP、DNS、JNDI在應用服務器中的使用應用程序如何連接客戶端獲得JNDI對Java應用程序使用perties配置文件連接客戶端 其中:1為客戶端所在機器的<initial-context-factory>tongtech.jms.jndi.JmsContextFactory</initial-context-TongLINK/QJMS系JMSP2P或P/SConnectionSession,它是P2P或P/S事務管理的基本結構是MessageProducer和MessageConsumer。TopicQueue1所示:圖1.JMS類層次結構NamingNamingService 第二章客戶端參數配配置,主要與客戶端進程運行性能相關的一些參數;第二部分為JMS隊列定義。TongCliBroker.Conf配置文件格式um=TaskNum=MemBlocksNum=MemBlockSize=BlockSize=ListenQueueNum=DeadTime=JmsQueueName=JmsQueueType=TlqQueueName=系統參數配置系統參數配置格um=TaskNum=SessionPerTaskNum=MemBlocksNum=MemBlockSize=BlockSize=sValve=ListenQueueNum=DeadTime=參數配置說明TaskNumJMS服務進程為多任務模式,提高并發任務的個數可以提高性能。Default:1。Unx平臺,啟動客戶端后,啟動客戶端的進程個數為Taku1個,中一客端管理程。數為TaskNum+1個,其中一個線程為管理線程。發時,SessionPerTaskNum*TaskNum*2的值必須小于 配置文件中um配置的值。這里的Session與JMSAPI的Session概念相同。Default:100。MemBlocksNumSessionblob數據成員的內存塊,Default1(目sValve:客戶端閥值(性能優化參數)。當客戶端的任務并發處理的session數sessionsession連接請求交給該任務ListenQueueNum:socket的等待隊列的大小向客戶端服務進程申請任意服務,則客戶端服務進程將該連接強JmsQueueName=JmsQueueType=TlqQueueName=隊列定義說明TlqQueueName:TongLINK/Q的隊列JMSJMS隊列對應的JMSJMS格PubQueName=SubQueName說ame:JMS名特別說明第三章客戶端應客戶端的結構模在TongLINK/Q節點中,客戶端進程負責與JMS客戶端的連接和通信的過程,但是實際上客戶端進程借助TongLINK/Q傳輸進程提供的TongLINK/Q消息隊列,來實JMS隊列實際上并不真正存在。使用時通過配置,JMS隊列被映射到TongLINK/Q隊列上。客戶端進程的結構圖如下:JMSJMSJMSJMS特別說明:JMS隊列和TongLINK/Q隊列的映射關系參見下面JMS客戶通信TongLINK/Q_JMS客戶通集中通信 JQ1JQ發送消息:當客戶A通過JQ隊列發送消息時,客戶端進程根據JQ隊列的發送定義,將消息內容放入TongLINK/Q隊列RcvQ中。接收消息:當客戶B通過JQ1隊列接收消息時,客戶端進程收到客戶B接收消息的請JQ1TongLINK/Q隊列(RcvQ)中取出消息返回給客戶B。注意:集中通信參數配置舉例TongCliBroker.Conf配置如下:um=TaskNum=sValve=JmsQueueName=JQJmsQueueType=SendJmsQueueName=JQ1JmsQueueType=Recv注意:例中名為JQ和JQ1的Jms隊列都被映射到TongLINK/Q的接收隊列RcvQ跨節點通信收消息。此時JMS消息要利用TongLINK/Q跨節點之間的傳輸功能。消消消消消SendQ) 發送消息:JMS客戶A使用RJQ隊列發送消息時,首先將消息發送給客戶端??蛻舳苏业絉JQ的發送定義。根據配置,將消息放入發送隊列SendQ中。隨后TongLINK/Q將消息發送到Node2節點的RcvQ接收隊列中。戶端找到RJQ的接收定義。根據配置,不斷嘗試從接收隊列RcvQ中接收消息。當收到消息后將消息內容返回給客戶端B。注意:跨節點通信參數配置舉例TongCliBroker.Conf配置如下:um=TaskNum=sValve=JmsQueueName=RJQJmsQueueType=SendTlqQueueName=SendQTongCliBroker.Conf配置如下:um=TaskNum=sValve=JmsQueueName=RJQ1JmsQueueType=Recv配置說明定義。同樣必須在節點Node2處配置RJQ1隊列的接收定義。JMSTongLINK/QNode2RJQ1隊列創建的接收定義映射到TongLINK/Q隊列(RcvQ)上??蛻舳说淖骺蛻舳顺洚斂蛻舳藨贸绦蚝蚑ongLINK/Q之間的客戶端收到來自客戶端應用的消息請求后,調用TongLINK/QAPI執第四章客戶端系統日第一條記錄的描述語句都是:“=========JmsServerTask[0]started=========”。錯誤日志(TongCliBroker.sys)主要有:

E:[081914:08:41.163]:[\task.c:305]:[0,0,22,131]:task[f7b9b531]ofjmsserver運行日志(TongCliBroker.log)主要有:

E:[0819 task.c:305]:task[f7b9b531]ofjmsserverto第五章JMS應用開TongLINK/Q_JMS的環境設用JAVA消息服務。安裝TongLINK/Q(UNIX或WINDOWS)6.3標準版系統,安裝方法請參考系統 下有下面與JMS相關的文件:Windows環境:java\lib\tlqadapter.jarUNIX環境:java/lib/tlqadapter.jarCLASSPATHJ2EE自帶的幾個文件:jms.jar、fscontext.jar、jndi.jar和TongLINK/Q_JMS設置不同類型的連接連接是和JMS服務器交互的點,因此連接接口的每個實現必須知道如何與它自己的JMS服務器的一個實例連接。(publicConnection和ConnectionFactory的幾個實現的構造TongLINK/QJmsConnectionFactory構造通過指定主機名和端口構造hostname:JMSStringhostname=“desthost”;Intport=10024;Stringhostname=“desthost”;Intport=10024;ConnectionFactorycf=newtlkq協議名串構造tlkq:JMS通訊協議desthost:JMSIP10024:JMSStringurl=”tlkq://desthost:10024”;ConnectionFactoryStringurl=”tlkq://desthost:10024”;ConnectionFactorycf=newConnectionFactory(url);JNDI配置TongJndi.Conf配置文件TongJndi.Conf參數配置文件格式JndiType=NickName=Content=TongJndi.Conf參數配置說明 JndiJndiType: Jndi類型。包括:Queue(隊列),Topic(),Factory(工廠。NickName: JNDI對象的別名。 JndiTypeFactoryJndiTypeQueue時:JmsJndiType為Topic時:JMS的名字特別說明JMSAdmin.config配置文件在安裝了TongLINK/Q forJava之后,在Java\bin下找到JMSAdmin.config文件。該文件主要用來說明Context的方式及地址,對應于文件中的兩個參數INITIAL_CONTEXT_FACTORY和PROVIDER_URL。JMSAdmin.config參數配置文件格式JMSAdmin.config配置文件說明 tongtech.jms.jndi.JmsContextFactoryTongLINK/QJms客戶端所有JNDI操作的根。它和INITIAL_CONTEXT_FACTORY一一對應。PROVIDER_URL格式:用于LDAP 此參數有三個值,none(認證、simple(簡單認證)和CRAM-MD5(認JMSAdmin的啟動可以在 %TLQHOMEDIR%\java\bin\JMSAdmin-cfg(其中“%TLQHOMEDIR%”為TongLINK/Q的系統安裝路徑JMSAdmin.config配置文件舉例JNDIConnectionFactory ConnectionFactory和Queue。 defineexamplecfConnectionFactoryConnectionFactory對象到examplecf defineq(exampleql)定義一個名exapeql的Queue對象,該對象使用名為Jmsque的jms隊列。即綁定Queue對象到exapeq名字上,通過exapeq名字指向可用的MS物理隊列名稱Jsque。copycopyq(exampleql)從命名exampleq1一個名字為q11的Queue綁定對象。-copycf(examplecf)從命名examplecf一個名字為cf1的ConnectionFactory綁定對象。即examplecf與cf1的對象相同。movemoveq(exampleql)改變Queue綁定對象名字exampleq1為q12。即exampleq1改名為q12子上下文的定義可以定義子上下文subcontext的操作。disyctx----顯示jndi綁定的上下文信息definectx(ctxname)--定義子上下文信息changectx(ctxname)--進入子上下文信息changectx(=up) change delete ConnectionFactoryQueue對象。若需要有子上下文,則先定義其子上下文,JNDI對定義Queue對 假設客戶端的IP地址為22,端口為在TongLINK/Q安裝 java/bin下執行JMSAdmin.bat; define定義Queue對 defineq(tlqQueue)定義一個名為tlqQueue的Queue對象,該對象使用名為jmsque0Jms隊列[Jndi][JndiRecord]JndiType=FactoryNickName=tlqCFContent=CF[Jndi][JndiRecord]JndiType=QueueContent=jmsque0注意事項JNDI應標準JNDI屬性文件件在環境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屬性文件說明如果傳入命令行參數,則該代碼是限定特性文件名,并且按此方式調用類:JavaJmsPropBindc:\config\CLASSPATH上查找特性文件,因此有必要將包含該文件的放到類裝入JNDI屬性文件的兩種方法可以將屬性文件的名稱和位置作為命令行參數裝入。(調用loadFromFile(StringfileName)方法)jndijndi服可以將屬性文件作為資源束裝入。(loadFromResourceBundle方法)方式。資源束從類路徑裝入,代碼并不依賴于能夠JVM命有些組件(EJB組件)不能直接使用文件I/OJNDI服務Propertiesp=newProperties();Propertiesp=newProperties();p.put(“vider.url”,”tlkq://desthost:10024/”);InitialContextctx=newInitialContext(p);ConnectionFactorycf=(ConnectionFactory)ctx.lookup("mycf");ConnectionConnection=程序說明:JNDIPublicConnectionFactorylookupConnectionFactory()Throwsjavax.naming.NamingException{ReturnPublicConnectionFactorylookupConnectionFactory()Throwsjavax.naming.NamingException{Return}publicQueuelookupQueue()throws{return}查詢說明: (ConnectionFactory)ctx.lookup(“examplecf”)返回對象被強制轉換為 ”)JNDIService名稱體系結 客戶機代碼JNDIService中名為myQueue的名稱空間,而管理員可任一隊列目的地。也可以把特定的JMS供應商的詳細信息隱藏于用來在JNDI中查詢名稱空間的簡單名稱之后。這樣在JMS 客戶機與實際的JMS目的地之間設置一個間JMS規范將那些由管理員創建并且包含由JMS客戶機使用的配置信息的對象稱為JMS受管的對象JNDIJNDI名稱空間JMS編程JMSJMSPTPPub/SubConnectionFactory:創建ConnectionConnection:創建一個到消息系統目的地的連接Destination:消息的目的地JMS的步JNDIConnectionFactory用JNDI得到目標隊列或對象,即Destination對象ConnectionFactoryConnectionSessionMessageProducerJMS中使用Session注意事TLQ的JMSSession不是線程安全的對象,而且每一個Session實例對應一個實際的TCPsocket連接。在使用的時候必須注意以下方面:SessionSession最多只能有一個線程訪一個特殊的場景是在MDB中使用Session:MDBEJB容器當中運MDB實例(也就是會產生多個線程)TLQJMS使用模式:SessionMDBMDB實例擁有Session。Session收/發消息要控制好session的數量。一個JMS應用Session數量應該有消息處理盡量使用同一個Session實例,Session使用完畢應及時關閉。JMS客戶端程JMS的發送/接收消息程序//發送消息程序//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程序說明創建一個創建一個到消息系統發送者的連接(Connection),通過使用一個和目標隊列對象,通常用JDNI來指定:ContextjndiContext=newInitialContext();Destinationdestination=(Destination)jndiContext.lookup(destinationName);Connectionconnection=factory.createConnection();創建一個或多個ConnectionJMSSessionSessionJMSsendSessionconnect.createQueueSession(falseSession.AUTO_ACKNOWLEDGE);rcvSession=connect.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);MessageProducer用Session創建MessageProducerMessageConsumer。MessageProducerproducer=session.createProducer(destination);MessageConsumerconsumersession.createConsumer(destination);啟動防止在初始化時發生不可預料的行為。一旦初始化結束,必須讓Connection啟動消息創建一個消息發送者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的發布/訂閱消息程序//發布消息程序//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;程序說明:創建一個創建一個到消息系統發送者的連接(Connection),通過使用一個和目標隊列對象,通常用JDNI來指定:ContextjndiContext=newInitialContext();Destinationdestination=(Destination)jndiContext.lookup(destinationName);Connectionconnection=factory.createConnection();創建一個或多個pubSession=connect.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);subSession=connect.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);MessageProducerSession創建MessageProducerMessageConsumer。MessageProducerproducer=session.createProducer(destination);MessageConsumerconsumersession.createConsumer(destination);啟動防止在初始化時發生不可預料的行為。一旦初始化結束,必須讓Connection啟動消息創建一個消息產生者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應用程序的編寫隊列有兩種創建方式:ConnectionFactory--Connection-Session-Queue消息發普通方式發送程序流程sendsendSessionMessageProducersend(Messagemessage,intmode,intprior,longtime)sendMessage(Destdest,Msgmsg,intmode,intprior,long時取值必須在1..10之間。JMS發送程序舉 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特別說明receive(longtimeout)receiveNoWait()方法時,可能使用receive(longtimeout)函數接收消息的方式,函數發出接收消息請求。timeout值比較小,消息較大,網絡速度較慢,或者此時隊列中沒消息時,在timeout時間內接收不到消息,函數退出。之后由服務器端發出的消息會到達JMS客戶端,在現的情況與receive(longtimeout)函數接收消息的方式相同。TongLINK/QJMS消息收發方式用戶使用現有版本,采用以下措施避免消息丟失:使用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)}}消息發送事務JMS發送方事務流程sendsendSession--Session--XASessionXAResourcegetXAResourceXASessionSessiongetSessionXASessionXAResource來控制其事務性分配。XAResource將會send(Messagemessage,intmode,intprior,longtime)sendMessage(Destdest,Msgmsg,intmode,intprior,longJMS發送方事務程序舉例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);}}//消息接收事務JMS接收方事務流程Session--Session--XASessionXAResourcegetXAResourceXASessionSessiongetSessionXASessionXAResource來控制其事務性分配。receive(long特別說明再通過XAResource操作JMS的事務。JMS接收方事務程序舉例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);}}//消息相關性JMS相關性流JMSCorrelationID QueueSession創建QueueSender列中的消息JMSCorrelationID沒有重復。JMS相關性程序舉例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簡介是不可見的。MDB是JMS系統的一部分,作為消費者實現服務器上的商業邏輯程序。MDBBeanXMLEJB1.1規范中,定義了兩種類BeanBean的方法。MDBEJBJMSJMSAPI,MDBPub/SubP2P模型。。ContextinitialContext=newInitialContext(); MDB特征MDB是一個偵,不是一個過程調用組件MDB只能與一個Queue/TopicMDB的實MDB實現javax.ejb.MessageDrivenBeanjavax.jms.MessageListenerpublicinterfacepublicvoidsetMessageDrivenContext(MessageDrivenContextmdc);publicvoidejbCreate();publicvoid}MessageListener接口定義onMessage()MessageListener{publicvoid}MDB的生命周EJBMDB(not

MDB的生命周期圖容器調用newInstance()方法,用來對消息驅動Bean進行實例化容器調用eMesagDrenonx()方法并提供給MDB一個Mesagervenonet的實例。JMS客戶機(Java應用程序、Bean或本地客戶機)發送的任何消息,將由消息路由當一條消息被發送給一個消息驅動Bean時,EJB容器就會從池中選擇消息Bean實例來當消息驅動BeanonMessage()方法時,它就會接收到這條消息。一旦這條Bean的onMessage()方法返回時,消息驅動Bean實例即返回到池中并準備處理另一個消息。onMessage()方法對消息作語法分析并將操作委托給業務邏輯層,例如會話Bean。若容器需要減少池的大小或服務器關閉,則在實例丟棄時對實例調用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集成到應用程序中器JMSMDB集成到應用程序的典型方法。MDB提供一個標準方法以創建語法分析和處理的邏輯。在典型情況下,MDBEJB數情況下為會話Bean。MDB。此設計模式能夠提高組件的重用使用。即MDB僅作為應用程序的接口進行工作。第八章Weblogic上的應修改Weblogic的啟動修改weblogic相應域的啟動startWebLogic.cmd,以便讓weblogic能夠TongLINK/Q的類庫。如想使用my1域,該域對應的路徑為 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 -- 啟動啟動TongLINK/Q前,必須配置好需要的隊列和TongLINK/Q參數。在配置文件TongUser.Conf中,重要的系統參數配置為: 其他配置請參見TongLINK/Q6.2系統管理手冊第三章。在配置文件TongCliBroker.Conf中,對系統參數和JMS隊列的具體配置請參見第三章 啟動啟動JmsAdmin如下:配置ConnectionFactoryJNDI名為:myCF:配置XAConnectionFactory的JNDI配置queueJNDI查看配置的啟動ConfigureanewForeign配置ForeignJMSConnection查看JNDI編寫編寫不需要支持的如果不需要管理,則該mdb的transaction-type應該配置為Bean類型,并且使packageimportjavax.ejb.*;importjavax.jms.*;packageimportjavax.ejb.*;importjavax.jms.*;{MessageDrivenContextmessageDrivenContext;publicvoidejbCreate()throwsCreateException{}publicvoidejbRemove()}publicvoidonMessage(Message{System.out.println(" TextMessagetm

溫馨提示

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

評論

0/150

提交評論