﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Java 人生-随笔分类-java EE(JMS)</title><link>http://www.blogjava.net/ejinmy/category/9390.html</link><description>java (Java EE)&amp;Linux</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 15:33:09 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 15:33:09 GMT</pubDate><ttl>60</ttl><item><title>近期的思考</title><link>http://www.blogjava.net/ejinmy/archive/2006/08/01/61245.html</link><dc:creator>jinmy liao</dc:creator><author>jinmy liao</author><pubDate>Tue, 01 Aug 2006 12:11:00 GMT</pubDate><guid>http://www.blogjava.net/ejinmy/archive/2006/08/01/61245.html</guid><wfw:comment>http://www.blogjava.net/ejinmy/comments/61245.html</wfw:comment><comments>http://www.blogjava.net/ejinmy/archive/2006/08/01/61245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ejinmy/comments/commentRss/61245.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ejinmy/services/trackbacks/61245.html</trackback:ping><description><![CDATA[
		<p>  好久都沒有來這裡看一下了,由於這兩個月要忙一個流程，公司在英國開一個銷售公司，要准備程序給他們用，本來現在的流程運作基本上可以，但是現在的程序能拿到英國用?<br />  由於是一個銷售的公司，有了銷售、采購、倉庫就差不多了。這些程序我們都有，但是為了那邊的程序、流程能順暢的運行，任務還有好多，到8月15任務就要完成，也差不多了，呵，看了下現在的情況，還基本上可以，不過還有程序沒有組合起來。<br />  從這兩個月的任務中，我感覺到程序的開發要做到重用、擴展，並不是很容易的事。<br />首先從數據層來說，不同的地方有可能使用不同的數據表，在java中開發到是比較容易處理，但是如果是用C/S的delphi開發的大部分都是直接使用sql的，很難實現這一點<br />也許你會說，為什麼不使用同一個數據表?情況很多，我們公司是這樣的，賣了一套ERP（不完整版本）,自己開發了其余部分，這兩個程序<br />要同時運行，只有我們新開發的程序要使用不同表的情況。同樣我們的合作公司，有可能有他自己的系統，如果能做到不依賴於基表<br />就更容易重用，數據共享.<br />接下來就是:業務功能的重用.<br />像倉庫的進貨、出貨，可用於PO,SO,生產等，都是一樣的意義。為了能使不同地方的業務功能能重用，我們使用SOA的思想<br />利用WebServices、ESB的技術來實現，業務的服務化.<br />再就是:擴展<br />不同的地方有可能需求有不同，這是很合乎情理的，如現在英國要看到我們貨物在途量，本來倉庫沒有這個功能的.<br />我想要做到軟件的可維護、可重用不是簡單的知道使用語言，這個直接輿個人的習慣有很大的關係<br />其他開發軟件，就是開發人員處理這個，等於生活的中的煮飯一樣，有的人很輕松就完成，有的人就弄的一團糟<br />多鍛煉積累經驗也是重要，最後提醒自己，做任何事情都不能馬虎，要仔細考慮。同時希望8.15能完成任務</p>
		<p> </p>
<img src ="http://www.blogjava.net/ejinmy/aggbug/61245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ejinmy/" target="_blank">jinmy liao</a> 2006-08-01 20:11 <a href="http://www.blogjava.net/ejinmy/archive/2006/08/01/61245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMS入門</title><link>http://www.blogjava.net/ejinmy/archive/2006/04/20/42124.html</link><dc:creator>jinmy liao</dc:creator><author>jinmy liao</author><pubDate>Thu, 20 Apr 2006 03:15:00 GMT</pubDate><guid>http://www.blogjava.net/ejinmy/archive/2006/04/20/42124.html</guid><wfw:comment>http://www.blogjava.net/ejinmy/comments/42124.html</wfw:comment><comments>http://www.blogjava.net/ejinmy/archive/2006/04/20/42124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ejinmy/comments/commentRss/42124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ejinmy/services/trackbacks/42124.html</trackback:ping><description><![CDATA[
		<p>
				<br />消息傳遞系統通常被成為MOM(Message Oriented MiddleWare),作為消息服務器，MOM需要客戶端用統一的標准訪問服務器，JMS標准是使用<br />最廣泛的消息接口標准.<br />JMS消息分點對點、基於主題的消息兩種<br />點對點方式:是兩個客戶端建立消息隊列，消息發送者(sender)把消息(Message)給消息服務器中的一個隊列(Queue),消息接受者(receiver)從服務器中這個隊列中<br />獲取消息.<br />主題消息:消息發送者響向消息服務器中的一個主題發送消息(Message),對這個消息有訂閱的接受者都會接受到這個消息.<br />JMS中的主要名詞:<br />1)目的地(Desination)<br /> 是發送者和接受者的一個共同的地點，發送者把消息發送到這裡，接受者從這裡獲取消息,是我們在服務器中創建的一個隊列，服務器會對這個地方的所有消息維護。<br />2)會話<br /> 消息發送者和接受，都要通過JNDI獲取消息服務器的上下文，session就是這樣的一個上下文對象，它可以創建消息生產者、消費者，可以創建點對點消息、主題消息<br />所有的消息操作都圍繞這個會話展開.</p>
		<p>消息結構的介紹<br />用過web services(SOAP)應該知道消息包括信封、消息頭、主體、附件.同樣JMS消息結構也是差不多包括消息頭、消息屬性、消息體.<br />以JMS、SOAP為基礎可以實現面向消息模型(MOM Message Oriented Model)。<br />JMS消息樣式:<br />SpyTextMessage {<br />     Header { <br />        jmsDestination  : QUEUE.mytestjms<br />        jmsDeliveryMode : 2<br />        jmsExpiration   : 0<br />        jmsPriority     : 4<br />        jmsMessageID    : ID:6-11454947326091<br />        jmsTimeStamp    : 1145494732609<br />        jmsCorrelationID: null<br />        jmsReplyTo      : null<br />        jmsType         : null<br />        jmsRedelivered  : false<br />        jmsProperties   : {}<br />        jmsPropReadWrite: false<br />        msgReadOnly     : true<br />        producerClientId: ID:6<br />     }<br />     Body {<br />        text            :sender message from liao test<br />     }<br />JMS簡單編程實現點對點的消息　服務器用jboss-4.0.3SP1<br />1)首先在JBOSS中部屬一個點對點的消息隊列<br />配置文件放在JBOSS_Home\server\default\deploy\jms<br />配置文件的內容為:<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;</p>
		<p>&lt;server&gt;<br /> &lt;!--是一個點對點的用org.jboss.mq.server.jmx.Queue(Topic),desination的名稱為mytestjms  <br />  更多的配置說明可以看原來jboss自帶的Jms配置文件，文件名要用*-service.xml<br /> --&gt;<br />  &lt;mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=mytestjms"&gt;<br />    &lt;depends optional-attribute-name="DestinationManager"&gt;jboss.mq:service=DestinationManager&lt;/depends&gt;<br />  &lt;/mbean&gt;</p>
		<p>&lt;/server&gt;<br />2)實現消息發送者<br />import java.util.Hashtable;<br />import javax.jms.*;<br />import javax.naming.*;<br />public class JMSSender {<br />    QueueSession session;<br />    QueueConnection conn;<br />    QueueSender sender;<br />    QueueReceiver receiver;<br />    public void clientconnect()throws Exception <br />    {<br />        <a href="file://消">//消</a>息服務器(destination)設置<br />        Hashtable env =  new Hashtable();<br />        env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");<br />        env.put(Context.PROVIDER_URL,"localhost");<br />        Context iniCtx = new InitialContext(env)  ;<br />         <a href="file://查">//查</a>找<a href="file://查/"></a>創建JMS連接的工廠類<br />        Object tmp = iniCtx.lookup("ConnectionFactory");<br />        QueueConnectionFactory qcf = (QueueConnectionFactory)tmp;<br />        <br />        <a href="file://查">//查</a>找JMS目標對象 點對點<br />        Queue queue = (Queue)iniCtx.lookup("queue/mytestjms");<br />        <a href="file://創">//創</a>建JMS連接<br />        conn = qcf.createQueueConnection();<br />        <a href="file://創">//創</a>建JMS會話<br />         session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);<br />         <a href="file://開">//開</a>始連接<br />        conn.start();<br />        sender = session.createSender(queue);<br />        receiver = session.createReceiver(queue);<br />    }<br />    public  JMSSender()<br />    {<br />        try{<br />           System.out.println("begin"); <br />            clientconnect();<br />            TextMessage textmsg = this.session.createTextMessage();<br />            textmsg.setText("sender message from liao test");<br />            <a href="file://發">//發</a>送消息　點對點<br />            sender.send(textmsg);<br />            disConnect();<br />            System.out.println("success");<br />        }catch(Exception e)<br />        {<br />            e.printStackTrace();<br />        }</p>
		<p>    }<br />    /**<br />     * 停止和關閉JMS連接<br />     * @throws JMSException<br />     */<br />    public void disConnect() throws JMSException<br />    {<br />        conn.stop();<br />        session.close();<br />        conn.close();<br />    }<br />    public Message receiver() throws JMSException<br />    {<br />        return receiver.receive(1000);<br />    }<br />    public static void main(String[] args)throws Exception<br />    {<br />         new JMSSender();<br />    }<br />}<br />3)實現消息接受者<br />import java.util.Hashtable;<br />import javax.jms.*;<br />import javax.naming.*;<br />public class JMSReceiver {<br />    QueueSession session;<br />    QueueConnection conn;<br />    QueueReceiver receiver;<br />    <br />    public void clientconnect()throws Exception <br />    {<br />        Hashtable env =  new Hashtable();<br />        env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");<br />        env.put(Context.PROVIDER_URL,"localhost");</p>
		<p>        Context iniCtx = new InitialContext(env)  ;<br />        Object tmp = iniCtx.lookup("ConnectionFactory");<br />        QueueConnectionFactory qcf = (QueueConnectionFactory)tmp;<br />        Queue queue = (Queue)iniCtx.lookup("queue/mytestjms");<br />        conn = qcf.createQueueConnection();<br />         session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);<br />        conn.start();<br />        receiver = session.createReceiver(queue);<br />    }<br />    public void disConnect() throws JMSException<br />   {<br />       conn.stop();<br />       session.close();<br />       conn.close();<br />   }<br />   public Message receiver() throws JMSException<br />   {<br />       return receiver.receive(1000);<br />   }<br />   public JMSReceiver()throws Exception<br />   {<br />        clientconnect();<br />         Message msg = receiver();<br />         System.out.println(msg);<br />         if (msg instanceof TextMessage)<br />         {<br />             TextMessage tmsg = (TextMessage)msg;<br />             <a href="file://消">//消</a>息主題內容:<br />             System.out.println(tmsg.getText());<br />         }<br />         System.out.println("success");<br />         disConnect();<br /> <br />   }</p>
		<p> </p>
		<p>    public static void main(String[] args)throws Exception<br />    {<br />        new JMSReceiver();<br />    }<br />}<br /><br />主題消息用到Topic,思路基本相同，接受必需先訂閱消息主題，當有發送者把消息發給這個主題的時候<br />先前訂閱的接受就會收到這個消息。<br />SOA中JMS也是一個熱門，客戶端通常用JMS發送消息再ESB中調用具體的服務。</p>
<img src ="http://www.blogjava.net/ejinmy/aggbug/42124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ejinmy/" target="_blank">jinmy liao</a> 2006-04-20 11:15 <a href="http://www.blogjava.net/ejinmy/archive/2006/04/20/42124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>消息傳遞服務器</title><link>http://www.blogjava.net/ejinmy/archive/2006/04/18/41733.html</link><dc:creator>jinmy liao</dc:creator><author>jinmy liao</author><pubDate>Tue, 18 Apr 2006 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/ejinmy/archive/2006/04/18/41733.html</guid><wfw:comment>http://www.blogjava.net/ejinmy/comments/41733.html</wfw:comment><comments>http://www.blogjava.net/ejinmy/archive/2006/04/18/41733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ejinmy/comments/commentRss/41733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ejinmy/services/trackbacks/41733.html</trackback:ping><description><![CDATA[
		<p>消息在同一個系統中或者在不同的系統都可以要交互，因為工作都是要交流的，就拿企業的定單修改為例子，當一個定單要修改，得通知不同的管理人員，當然還要更可靠的消息(Email),在OA系統中，經常要監測消息，看是否有流程任務到達該用戶，有則提示消息。<br />下面是我做的一個小的服務器處理消息，功能如下:</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1)<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供客戶端調用的接口(web services)</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2)<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">編寫處理處理消息的類，消息現在包括</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt">,</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">登陸消息、登出消息、消息發送,消息狀態的修改</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">登陸消息包括</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt">:</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客戶端的用戶名、</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt">ip</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、端口</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt">;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">登出消息包括</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt">:</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客戶端的用戶名，服務器將注銷客戶端登陸時發過來的消息</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">發送的消息包括</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt">:</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">發送人，接受人，發送事件，發送的內容</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt">.<br />修改狀態:包括消息的關鍵字ID<br /></span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">3)<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在客戶端登陸的時候監測是否是否有新消息，有則發送給客戶端<br /></span>
				<span lang="EN-US" style="FONT-SIZE: 10pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-TW; mso-bidi-language: AR-SA">
						<br />4)發送的消息如果接受用戶不在線，則保存該消息，等接受者登陸的時候再發送給接受者。<br /><br />消息有一個狀態N表示新的消息，O表示已經確認的消息.<br />消息傳給用戶，用戶確認在回寫消息狀態<br />客戶端調用的接口可以是JMS,Http由於現在只有delphi客戶端，現在提供web services訪問<br />流程圖:<img height="836" alt="flow.bmp" src="http://www.blogjava.net/images/blogjava_net/ejinmy/flow.bmp" width="489" border="0" /></span>
		</p>
<img src ="http://www.blogjava.net/ejinmy/aggbug/41733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ejinmy/" target="_blank">jinmy liao</a> 2006-04-18 20:22 <a href="http://www.blogjava.net/ejinmy/archive/2006/04/18/41733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>