﻿<?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-rednight</title><link>http://www.blogjava.net/rednight/</link><description>0x2B|~0x2B,That's not a question,Just do it.</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 09:40:32 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 09:40:32 GMT</pubDate><ttl>60</ttl><item><title>消息中间件和JMS</title><link>http://www.blogjava.net/rednight/archive/2007/04/11/109941.html</link><dc:creator>rednight</dc:creator><author>rednight</author><pubDate>Wed, 11 Apr 2007 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/rednight/archive/2007/04/11/109941.html</guid><wfw:comment>http://www.blogjava.net/rednight/comments/109941.html</wfw:comment><comments>http://www.blogjava.net/rednight/archive/2007/04/11/109941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rednight/comments/commentRss/109941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rednight/services/trackbacks/109941.html</trackback:ping><description><![CDATA[<p><font face=Verdana size=2>当前，CORBA、DCOM、RMI等RPC中间件技术已广泛应用于各个领域。但是面对规模和复杂度都越来越高的分布式系统，这些技术也显示出其局限性：（1）同步通信：客户发出调用后，必须等待服务对象完成处理并返回结果后才能继续执行；（2）客户和服务对象的生命周期紧密耦合：客户进程和服务对象进程都必须正常运行；如果由于服务对象崩溃或者网络故障导致客户的请求不可达，客户会接收到异常；（3）点对点通信：客户的一次调用只发送给某个单独的目标对象。 <br>&nbsp;&nbsp; 面向消息的中间件（Message Oriented Middleware，MOM）较好的解决了以上问题。发送者将消息发送给消息服务器，消息服务器将消息存放在若干队列中，在合适的时候再将消息转发给接收者。这种模式下，发送和接收是异步的，发送者无需等待；二者的生命周期未必相同：发送消息的时候接收者不一定运行，接收消息的时候发送者也不一定运行；一对多通信：对于一个消息可以有多个接收者。 <br>&nbsp;&nbsp; 已有的MOM系统包括IBM的MQSeries、Microsoft的MSMQ和BEA的MessageQ等。由于没有一个通用的标准，这些系统很难实现互操作和无缝连接。Java Message Service（JMS）是SUN提出的旨在统一各种MOM系统接口的规范，它包含点对点（Point to Point，PTP）和发布/订阅（Publish/Subscribe，pub/sub）两种消息模型，提供可靠消息传输、事务和消息过滤等机制。</font>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1><strong>1.JMS<br></strong>&nbsp;&nbsp; JAVA 消息服务(JMS)定义了Java 中访问消息中间件的接口。JMS 只是接口，并没有给予实现，实现JMS 接口的消息中间件称为JMS Provider，iLink实现了JMS接口，用户可以通过使用JMS接口，在iLink中进行JMS编程。 iLink支持JMS1.0.2版本。 <br><br><strong>2.JMS接口描述<br></strong>&nbsp;&nbsp; JMS 支持两种消息类型PTP 和Pub/Sub，分别称作：PTP Domain 和Pub/Sub Domain，这两种接口都继承统一的JMS父接口，JMS 主要接口如下所示：<br></font>
<table cellSpacing=0 cellPadding=0 width="97%" align=left border=0 nof="TE">
    <tbody>
        <tr>
            <td>
            <table id=Table3 cellSpacing=3 cellPadding=1 width="100%" border=1>
                <tbody>
                    <tr>
                        <td width="22%" height=16>
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>MS父接口</font></p>
                        </td>
                        <td width="29%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>PTP</font></p>
                        </td>
                        <td width="48%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Pub/Sub</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="22%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>ConnectionFactory</font></p>
                        </td>
                        <td width="29%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueConnectionFactory</font></p>
                        </td>
                        <td width="48%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicConnectionFactory</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="22%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Connection</font></p>
                        </td>
                        <td width="29%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueConnection</font></p>
                        </td>
                        <td width="48%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicConnection</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="22%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Destination</font></p>
                        </td>
                        <td width="29%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Queue</font></p>
                        </td>
                        <td width="48%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Topic</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="22%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Session</font></p>
                        </td>
                        <td width="29%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueSession</font></p>
                        </td>
                        <td width="48%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicSession</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="22%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>MessageProducer</font></p>
                        </td>
                        <td width="29%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueSender</font></p>
                        </td>
                        <td width="48%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicPublisher</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="22%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>MessageConsumer</font></p>
                        </td>
                        <td width="29%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueReceiver,QueueBrowse r</font></p>
                        </td>
                        <td width="48%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicSubscriber</font></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font></p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp;&nbsp; ConnectionFactory ：连接工厂，JMS 用它创建连接<br>&nbsp;&nbsp; Connection ：JMS 客户端到JMS Provider 的连接<br>&nbsp;&nbsp; Destination ：消息的目的地<br>&nbsp;&nbsp; Session： 一个发送或接收消息的线程<br>&nbsp;&nbsp; MessageProducer： 由Session 对象创建的用来发送消息的对象<br>&nbsp;&nbsp; MessageConsumer： 由Session 对象创建的用来接收消息的对象<br><br><strong>3.JMS消息模型<br></strong>JMS 消息由以下几部分组成：消息头，属性，消息体。<br>&nbsp;&nbsp; <br><strong>3.1 消息头(Header)</strong> - 消息头包含消息的识别信息和路由信息，消息头包含一些标准的属性如：JMSDestination,JMSMessageID 等。 <br></font>
<table cellSpacing=0 cellPadding=0 width="97%" align=left border=0 nof="TE">
    <tbody>
        <tr>
            <td>
            <table id=Table4 cellSpacing=3 cellPadding=1 width="100%" border=1>
                <tbody>
                    <tr>
                        <td width="25%" height=16>
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>&nbsp;消息头</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>&nbsp;由谁设置</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSDestination</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>send 或 publish 方法</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSDeliveryMode</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>send 或 publish 方法</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSExpiration</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>send 或 publish 方法</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSPriority</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>send 或 publish 方法</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSMessageID</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>send 或 publish 方法</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSTimestamp</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>send 或 publish 方法</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSCorrelationID</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>客户</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSReplyTo</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>客户</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSType</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>客户</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSRedelivered</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMS Provider</font></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font></p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp;</font></p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><strong></font></p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1><strong><br>3.2 属性(Properties)</strong> - 除了消息头中定义好的标准属性外，JMS 提供一种机制增加新属性到消息头 中，这种新属性包含以下几种：<br>&nbsp;&nbsp; 1. 应用需要用到的属性;<br>&nbsp;&nbsp; 2. 消息头中原有的一些可选属性;<br>&nbsp;&nbsp; 3. JMS Provider 需要用到的属性。<br>&nbsp;&nbsp; 标准的JMS 消息头包含以下属性： <br></font>
<p>
<table cellSpacing=0 cellPadding=0 width="96%" align=left border=0 nof="TE">
    <tbody>
        <tr>
            <td>
            <table id=Table5 cellSpacing=3 cellPadding=1 width="100%" border=1>
                <tbody>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSDestination</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>消息发送的目的地</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSDeliveryMode</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>传递模式， 有两种模式： PERSISTENT 和NON_PERSISTENT，PERSISTENT 表示该消息一定要被送到目的地，否则会导致应用错误。NON_PERSISTENT 表示偶然丢失该消息是被允许的，这两种模式使开发者可以在消息传递的可靠性和吞吐量之间找到平衡点。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSMessageID</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>唯一识别每个消息的标识，由JMS Provider 产生。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSTimestamp</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>一个消息被提交给JMS Provider 到消息被发出的时间。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSCorrelationID</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>用来连接到另外一个消息，典型的应用是在回复消息中连接到原消息。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSReplyTo</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>提供本消息回复消息的目的地址</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSRedelivered</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>如果一个客户端收到一个设置了JMSRedelivered 属性的消息，则表示可能该客户端曾经在早些时候收到过该消息，但并没有签收(acknowledged)。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSType</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>消息类型的识别符。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSExpiration</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>消息过期时间，等于QueueSender 的send 方法中的timeToLive 值或TopicPublisher 的publish 方法中的timeToLive 值加上发送时刻的GMT 时间值。如果timeToLive值等于零，则JMSExpiration 被设为零，表示该消息永不过期。如果发送后，在消息过期时间之后消息还没有被发送到目的地，则该消息被清除。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="25%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMSPriority</font></p>
                        </td>
                        <td width="74%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>消息优先级，从0-9 十个级别，0-4 是普通消息，5-9 是加急消息。JMS 不要求JMS Provider 严格按照这十个优先级发送消息，但必须保证加急消息要先于普通消息到达。</font></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
</p>
<font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana size=2></font></p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1><br><br><strong>3.3 消息体(Body)</strong> - JMS API 定义了5种消息体格式，也叫消息类型，你可以使用不同形式发送接收 数据并可以兼容现有的消息格式，下面描述这5种类型： <br></font>
<table cellSpacing=0 cellPadding=0 width="96%" align=left border=0 nof="TE">
    <tbody>
        <tr>
            <td>
            <table id=Table6 cellSpacing=3 cellPadding=1 width="100%" border=1>
                <tbody>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>消息类型</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>消息体</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TextMessage</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>java.lang.String对象，如xml文件内容</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>MapMessage</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>名/值对的集合，名是String对象，值类型可以是Java任何基本类型</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>BytesMessage</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>字节流</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>StreamMessage</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Java中的输入输出流</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>ObjectMessage</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Java中的可序列化对象</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Message</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>没有消息体，只有消息头和属性</font></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1><br><br><br><br><br><br><br><br><br><br></font></p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font></p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1><br><br>下例演示创建并发送一个TextMessage到一个队列： <br>TextMessage message = queueSession.createTextMessage();<br>message.setText(msg_text); // msg_text is a String<br>queueSender.send(message);<br><br>下例演示接收消息并转换为合适的消息类型： <br>Message m = queueReceiver.receive();<br>if (m instanceof TextMessage) {<br>&nbsp;TextMessage message = (TextMessage) m;<br>&nbsp;System.out.println("Reading message: " + message.getText());<br>} else {<br>&nbsp;// Handle error<br>}<br><br><strong>4. 消息的同步异步接收<br></strong>&nbsp;&nbsp; 消息的同步接收是指客户端主动去接收消息，JMS 客户端可以采用MessageConsumer 的receive方法去接收下一个消息。<br>&nbsp;&nbsp; 消息的异步接收是指当消息到达时，主动通知客户端。JMS 客户端可以通过注册一个实 现MessageListener 接口的对象到MessageConsumer，这样，每当消息到达时，JMS Provider 会调用MessageListener中的onMessage 方法。 <br><br><strong>5. PTP模型<br></strong>PTP(Point-to-Point)模型是基于队列的，发送方发消息到队列，接收方从队列接收消息，队列的存在使得消息的异步传输成为可能。和邮件系统中的邮箱一样，队列可以包含各种消息，JMS Provider 提 供工具管理队列的创建、删除。JMS PTP 模型定义了客户端如何向队列发送消息，从队列接收消息，浏览队列中的消息。<br>&nbsp;&nbsp; 下面描述JMS PTP 模型中的主要概念和对象：<br></font>
<p>
<table cellSpacing=0 cellPadding=0 width="96%" align=left border=0 nof="TE">
    <tbody>
        <tr>
            <td>
            <table id=Table1 cellSpacing=3 cellPadding=1 width="100%" border=1>
                <tbody>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>名称</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>描述</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Queue</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>由JMS Provider 管理，队列由队列名识别，客户端可以通过JNDI 接口用队列名得到一个队列对象。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TemporaryQueue</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>由QueueConnection 创建，而且只能由创建它的QueueConnection 使用。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueConnectionFactory</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>客户端用QueueConnectionFactory 创建QueueConnection 对象。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueConnection</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>一个到JMS PTP provider 的连接，客户端可以用QueueConnection 创建QueueSession 来发送和接收消息。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueSession</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>提供一些方法创建QueueReceiver 、QueueSender、QueueBrowser 和TemporaryQueue。如果在QueueSession 关闭时，有一些消息已经被收到，但还没有被签收(acknowledged)，那么，当接收者下次连接到相同的队列时，这些消息还会被再次接收。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueReceiver</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>客户端用QueueReceiver 接收队列中的消息，如果用户在QueueReceiver 中设定了消息选择条件，那么不符合条件的消息会留在队列中，不会被接收到。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueSender</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>客户端用QueueSender 发送消息到队列。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueBrowser</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>客户端可以QueueBrowser 浏览队列中的消息，但不会收走消息。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>QueueRequestor</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMS 提供QueueRequestor 类简化消息的收发过程。QueueRequestor 的构造函数有两个参数：QueueSession 和queue，QueueRequestor 通过创建一个临时队列来完成最终的收发消息请求。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="26%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>可靠性(Reliability)</font></p>
                        </td>
                        <td width="73%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>队列可以长久地保存消息直到接收者收到消息。接收者不需要因为担心消息会丢失而时刻和队列保持激活的连接状态，充分体现了异步传输模式的优势。</font> </p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
</p>
<font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>
<p><br><br>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp;&nbsp; <br>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1><br><strong>6. PUB/SUB模型<br></strong>JMS Pub/Sub 模型定义了如何向一个内容节点发布和订阅消息，这些节点被称作主题(topic)。<br>&nbsp;&nbsp; 主题可以被认为是消息的传输中介，发布者(publisher)发布消息到主题，订阅者(subscribe)从主题订阅消息。主题使得消息订阅者和消息发布者保持互相独立，不需要接触即可保证消息的传送。<br>&nbsp;&nbsp; 下面描述JMS Pub/Sub 模型中的主要概念和对象：<br></font>
<table cellSpacing=0 cellPadding=0 width="97%" align=left border=0 nof="TE">
    <tbody>
        <tr>
            <td>
            <table id=Table2 cellSpacing=3 cellPadding=1 width="100%" border=1>
                <tbody>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>名称</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>描述</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>订阅(subscription)</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>消息订阅分为非持久订阅(non-durable subscription)和持久订阅(durable subscrip-tion)，非持久订阅只有当客户端处于激活状态，也就是和JMS Provider 保持连接状态才能收到发送到某个主题的消息，而当客户端处于离线状态，这个时间段发到主题的消息将会丢失，永远不会收到。持久订阅时，客户端向JMS 注册一个识别自己身份的ID，当这个客户端处于离线时，JMS Provider 会为这个ID 保存所有发送到主题的消息，当客户再次连接到JMS Provider时，会根据自己的ID 得到所有当自己处于离线时发送到主题的消息。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Topic</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>主题由JMS Provider 管理，主题由主题名识别，客户端可以通过JNDI 接口用主题名得到一个主题对象。JMS 没有给出主题的组织和层次结构的定义，由JMS Provider 自己定义。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TemporaryTopic</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>临时主题由TopicConnection 创建，而且只能由创建它的TopicConnection 使用。临时主题不能提供持久订阅功能。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicConnectionFactory</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>客户端用TopicConnectionFactory 创建TopicConnection 对象。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicConnection</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicConnection 是一个到JMS Pub/Sub provider 的连接，客户端可以用TopicConnection创建TopicSession 来发布和订阅消息。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicSession</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicSession 提供一些方法创建TopicPublisher、TopicSubscriber、TemporaryTopic 。它还提供unsubscribe 方法取消消息的持久订阅。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicPublisher</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>客户端用TopicPublisher 发布消息到主题。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicSubscriber</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>客户端用TopicSubscriber 接收发布到主题上的消息。可以在TopicSubscriber 中设置消息过滤功能，这样，不符合要求的消息不会被接收。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>Durable TopicSubscriber</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>如果一个客户端需要持久订阅消息，可以使用Durable TopicSubscriber，TopSession 提供一个方法createDurableSubscriber创建Durable TopicSubscriber 对象。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>恢复和重新派送(Recovery and Redelivery)</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>非持久订阅状态下，不能恢复或重新派送一个未签收的消息。只有持久订阅才能恢复或重新派送一个未签收的消息。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>TopicRequestor</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>JMS 提供TopicRequestor 类简化消息的收发过程。TopicRequestor 的构造函数有两个参数：TopicSession 和topic。TopicRequestor 通过创建一个临时主题来完成最终的发布和接收消息请求。</font></p>
                        </td>
                    </tr>
                    <tr>
                        <td width="27%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>可靠性(Reliability)</font></p>
                        </td>
                        <td width="72%">
                        <p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1>当所有的消息必须被接收，则用持久订阅模式。当丢失消息能够被容忍，则用非持久订阅模式。</font></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font></p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1><br>&nbsp;</font></p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1></font>&nbsp;</p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1><br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp; <br>&nbsp;</font></p>
<p><font face=Verdana,Tahoma,Arial,Helvetica,Sans-serif,sans-serif size=-1><br><strong><br><br>7. 开发JMS的步骤<br></strong>&nbsp;&nbsp; 广义上说，一个JMS 应用是几个JMS 客户端交换消息，开发JMS 客户端应用由以下几步构成： <br>用JNDI 得到ConnectionFactory 对象； <br>用JNDI 得到目标队列或主题对象，即Destination 对象； <br>用ConnectionFactory 创建Connection 对象； <br>用Connection 对象创建一个或多个JMS Session； <br>用Session 和Destination 创建MessageProducer 和MessageConsumer； <br>通知Connection 开始传递消息。</font></p>
</font></strong>
<img src ="http://www.blogjava.net/rednight/aggbug/109941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rednight/" target="_blank">rednight</a> 2007-04-11 16:41 <a href="http://www.blogjava.net/rednight/archive/2007/04/11/109941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>经常碰到xml文件解析错误可以考虑是不是由于文本编辑器而导致的问题</title><link>http://www.blogjava.net/rednight/archive/2007/01/16/94099.html</link><dc:creator>rednight</dc:creator><author>rednight</author><pubDate>Tue, 16 Jan 2007 01:09:00 GMT</pubDate><guid>http://www.blogjava.net/rednight/archive/2007/01/16/94099.html</guid><wfw:comment>http://www.blogjava.net/rednight/comments/94099.html</wfw:comment><comments>http://www.blogjava.net/rednight/archive/2007/01/16/94099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rednight/comments/commentRss/94099.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rednight/services/trackbacks/94099.html</trackback:ping><description><![CDATA[
		<strong>问题描述:</strong>
		<pre>    &lt;[ServletContext(id=18489944,name=EBLGWeb,context-path=/)]: Deployment descriptor "/WEB-INF/bhr-tags-pagination.tld" is malformed. Check against the DTD: Content is not allowed in prolog. (line 1, column 1).&gt;
    &lt;[ServletContext(id=18489944,name=EBLGWeb,context-path=/)]: Error while parsing the Tag Library Descriptor at "/WEB-INF/bhr-tags-pagination.tld".
org.xml.sax.SAXException: [HTTP:101248][ServletContext(id=18489944,name=EBLGWeb,context-path=/)]: Deployment descriptor "/WEB-INF/bhr-tags-pagination.tld" is malformed. Check against the DTD: Content is not allowed in prolog. (line 1, column 1).
        at weblogic.apache.xerces.parsers.DOMParser.parse(DOMParser.java:285)
        at weblogic.apache.xerces.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:201)
        at weblogic.servlet.jsp.dd.JSPEntityResolver.load(JSPEntityResolver.java:81)
        at weblogic.servlet.jsp.dd.JSPEntityResolver.load(JSPEntityResolver.java:96)
        at weblogic.servlet.internal.WebAppHelper.registerTagLibListeners(WebAppHelper.java:293)
        at weblogic.servlet.internal.WebAppServletContext.activateFromDescriptors(WebAppServletContext.java:2530)
        at weblogic.servlet.internal.WebAppServletContext.activate(WebAppServletContext.java:6163)
        at weblogic.servlet.internal.WebAppServletContext.setActive(WebAppServletContext.java:6141)
        at weblogic.servlet.internal.WebAppModule.activate(WebAppModule.java:836)
        at weblogic.j2ee.J2EEApplicationContainer.activateModule(J2EEApplicationContainer.java:3322)
        at weblogic.j2ee.J2EEApplicationContainer.activate(J2EEApplicationContainer.java:2201)
        at weblogic.j2ee.J2EEApplicationContainer.activate(J2EEApplicationContainer.java:2174)
        at weblogic.j2ee.J2EEApplicationContainer.activate(J2EEApplicationContainer.java:2122)
        at weblogic.management.deploy.slave.SlaveDeployer$Application.setActivation(SlaveDeployer.java:3099)
        at weblogic.management.deploy.slave.SlaveDeployer.setActivationStateForAllApplications(SlaveDeployer.java:1768)
        at weblogic.management.deploy.slave.SlaveDeployer.resume(SlaveDeployer.java:351)
        at weblogic.management.deploy.DeploymentManagerServerLifeCycleImpl.resume(DeploymentManagerServerLifeCycleImpl.java:229)
        at weblogic.t3.srvr.SubsystemManager.resume(SubsystemManager.java:136)
        at weblogic.t3.srvr.T3Srvr.resume(T3Srvr.java:965)
        at weblogic.t3.srvr.T3Srvr.run(T3Srvr.java:360)
        at weblogic.Server.main(Server.java:32)
&gt;
</pre>
		<b>原因分析和解决方法:</b>
		<pre>是由于某些文本编辑器（UltraEdit）存文本的时候产生的问题。可以使用text pad, word pad编辑XML格式的文件。
</pre>
<img src ="http://www.blogjava.net/rednight/aggbug/94099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rednight/" target="_blank">rednight</a> 2007-01-16 09:09 <a href="http://www.blogjava.net/rednight/archive/2007/01/16/94099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有时WLS-Apache Proxy Plugin由于timeout的设置过短而认为处理它转发请求的应用服务器死掉了而进行Failvoer</title><link>http://www.blogjava.net/rednight/archive/2007/01/16/94098.html</link><dc:creator>rednight</dc:creator><author>rednight</author><pubDate>Tue, 16 Jan 2007 01:09:00 GMT</pubDate><guid>http://www.blogjava.net/rednight/archive/2007/01/16/94098.html</guid><wfw:comment>http://www.blogjava.net/rednight/comments/94098.html</wfw:comment><comments>http://www.blogjava.net/rednight/archive/2007/01/16/94098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rednight/comments/commentRss/94098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rednight/services/trackbacks/94098.html</trackback:ping><description><![CDATA[
		<strong>问题描述:</strong>
		<pre>通过HTTP提交EDI请求,当EDI处理时间超过了20分钟后,就会看到在另一个weblogic server也接收到了这个EDI请求,重新处理这个报文.
如果报文处理时间更长,比如超过了50分钟,就会发现这个报文被处理了3遍或5遍.
</pre>
		<b>原因分析和解决方法:</b>
		<pre>When the Apache HTTP Server Plug-In attempts to connect to WebLogic Server, the plug-in uses several configuration 
parameters to determine how long to wait for connections to the WebLogic Server host and, after a connection is
established, how long the plug-in waits for a response. If the plug-in cannot connect or does not receive a response, 
the plug-in attempts to connect and send the request to other WebLogic Server instances in the cluster. If the 
connection fails or there is no response from any WebLogic Server in the cluster, an error message is sent.


响应等待时间参数WLIOTimeoutSecs (http://e-docs.bea.com/wls/docs81/plugins/plugin_params.html#1149781.
按照BEA 推荐的，这个值应该设得大一些, 这个参数的缺省值为300s. 见下面：
&lt;Location /EDIHandler&gt;
         SetHandler weblogic-handler
         WebLogicCluster apc_app1wls1:7011,apc_app1wls2:7011
         KeepAliveEnabled ON
         WLIOTimeoutSecs 7200
&lt;/Location&gt;
</pre>
<img src ="http://www.blogjava.net/rednight/aggbug/94098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rednight/" target="_blank">rednight</a> 2007-01-16 09:09 <a href="http://www.blogjava.net/rednight/archive/2007/01/16/94098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Failed to Send MQ Message Problem</title><link>http://www.blogjava.net/rednight/archive/2007/01/16/94097.html</link><dc:creator>rednight</dc:creator><author>rednight</author><pubDate>Tue, 16 Jan 2007 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/rednight/archive/2007/01/16/94097.html</guid><wfw:comment>http://www.blogjava.net/rednight/comments/94097.html</wfw:comment><comments>http://www.blogjava.net/rednight/archive/2007/01/16/94097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rednight/comments/commentRss/94097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rednight/services/trackbacks/94097.html</trackback:ping><description><![CDATA[
		<p class="documentDescription">有时候使用的mq jar文件的版本不对给出现一些末名奇妙的问题,本文则是能接收消息但不能发送消息的一个问题.碰到这样的问题一定要记得double-check你使用的mq jar文件的版本</p>
		<div class="plain">
				<hr />
				<b>问题描述:</b>
				<pre>MQJMS200713 Oct 2006 16:47:15,484 ERROR MessagingUtilServlet [ExecuteThread: '14' for queue: 'weblogic.kernel.Default'][]: **********EXCEPTION TRACE START*************
13 Oct 2006 16:47:15,484 ERROR MessagingUtilServlet [ExecuteThread: '14' for queue: 'weblogic.kernel.Default'][]: produce error
com.bhr.infra.messaging.exception.PMException: JMSException
        at com.bhr.infra.messaging.PMHandler.send(PMHandler.java:419)
        at com.bhr.epc.infra.messaging.util.MessagingUtilServlet.produce(MessagingUtilServlet.java:312)
        at com.bhr.epc.infra.messaging.util.MessagingUtilServlet.service(MessagingUtilServlet.java:74)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1072)
        at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465)
        at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:348)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6981)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
        at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3892)
        at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2766)
        at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)
        at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)
Caused by: javax.jms.JMSException: MQJMS2007: failed to send message to MQ queue
        at com.ibm.mq.jms.services.ConfigEnvironment.newException(ConfigEnvironment.java:553)
        at com.ibm.mq.jms.MQMessageProducer.sendInternal(MQMessageProducer.java:1589)
        at com.ibm.mq.jms.MQMessageProducer.send(MQMessageProducer.java:1012)
        at com.ibm.mq.jms.MQMessageProducer.send(MQMessageProducer.java:1046)
        at com.bhr.infra.messaging.PMQueueSender.send(PMQueueSender.java:57)
        at com.bhr.infra.messaging.PMHandler.send(PMHandler.java:410)
        ... 13 more
13 Oct 2006 16:47:15,486 ERROR MessagingUtilServlet [ExecuteThread: '14' for queue: 'weblogic.kernel.Default'][]: **********EXCEPTION TRACE END**************

</pre>
				<b>原因分析和解决方法:</b>
				<pre>It may be caused by use of old version MQ jar. It can receive message, but cannot send message.
</pre>
		</div>
<img src ="http://www.blogjava.net/rednight/aggbug/94097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rednight/" target="_blank">rednight</a> 2007-01-16 09:08 <a href="http://www.blogjava.net/rednight/archive/2007/01/16/94097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cannot Forward a Response that is Already Committed</title><link>http://www.blogjava.net/rednight/archive/2007/01/16/94096.html</link><dc:creator>rednight</dc:creator><author>rednight</author><pubDate>Tue, 16 Jan 2007 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/rednight/archive/2007/01/16/94096.html</guid><wfw:comment>http://www.blogjava.net/rednight/comments/94096.html</wfw:comment><comments>http://www.blogjava.net/rednight/archive/2007/01/16/94096.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/rednight/comments/commentRss/94096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rednight/services/trackbacks/94096.html</trackback:ping><description><![CDATA[<p class="documentDescription">如果你碰到"Cannot Forward a Response that is Already Committed"这样的错误信息,一定是应用对一次http请求做了多次页面跳转或对response对象做过close后,又去写响应.</p><div class="plain"><pre>
这个问题的根本原因由于响应本次请求的Response对象的状态是已提交状态造成的, 它不允许响应提交多次。

什么时候Response对象的状态变成已提交状态：当你的应用已经实现了页面跳转逻辑。

通常原因：

1． 如果你使用了community的话， community的安全认证和授权如果没有通过，community内部会进行页面跳转。但你的应用(对于workshop应用的话，指的是action)又试图进行页面跳转，就会出现这样的问题。


    /**

     * @jpf:action

     * @jpf:forward name="page" path="page.jsp"

     */

    protected Forward actionMethod()

{

    //如果已经提交了响应，你仍然试图再次进行页面跳转，即再次提交响应，可能出现问题

    //通常可以加一个判断

 

       if (!getResponse().isCommitted()) {

            return new Forward("success");

        } else {

            return null;

        }

    }

 

    protected void beforeAction() {

       SecurityManager.checkAuthorization(getRequest(), getResponse(), config.getString(

                CDConstants.CREATE_TERM_ACTION_NAME, ""));

      //这个调用可能实现了页面跳转，即提交响应

}

 

注意JSP中实现页面跳转后，加return 语句防止继续提交响应:

 

&lt;%

       SecurityManager.checkAuthorization(getRequest(), getResponse(), config.getString(

                CDConstants.CREATE_TERM_ACTION_NAME, ""));

{

     //可能有实现页面跳转逻辑

    &#8230;&#8230;&#8230;&#8230;&#8230;forward();

        return;//记得加retrun.

    }

%&gt;

 

2. .如果没有使用community的话，下面情景也会出现这个问题

 

    /**

     * @jpf:action

     * @jpf:forward name="page" path="page.jsp"

     */

    protected Forward actionMethod()

 

//直接操作Response对象写响应

     getResponse().getPrintWriter().println();

    &#8230;

/

   // 又执行的页面跳转，也可能出现问题

        return new Forward("index");

    }
</pre>
		</div><img src ="http://www.blogjava.net/rednight/aggbug/94096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rednight/" target="_blank">rednight</a> 2007-01-16 09:07 <a href="http://www.blogjava.net/rednight/archive/2007/01/16/94096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Page Flow Error - No Relevant Page</title><link>http://www.blogjava.net/rednight/archive/2007/01/16/94094.html</link><dc:creator>rednight</dc:creator><author>rednight</author><pubDate>Tue, 16 Jan 2007 01:06:00 GMT</pubDate><guid>http://www.blogjava.net/rednight/archive/2007/01/16/94094.html</guid><wfw:comment>http://www.blogjava.net/rednight/comments/94094.html</wfw:comment><comments>http://www.blogjava.net/rednight/archive/2007/01/16/94094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rednight/comments/commentRss/94094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rednight/services/trackbacks/94094.html</trackback:ping><description><![CDATA[
		<p class="documentDescription">一个页面流在第一次使用时,内部属性currentpage并没有指定页面,所以避免在begin方法里使用return-to: current page用法.同时在用的时候注意页面流的工作方式</p>
		<div class="plain">
				<hr />
				<b>问题描述:</b>
				<pre>Error message like below in Web Page is displayed:

Page Flow:
 /com/xxxx/xxx/xxx.jpf
Action:
 update
 
Page Flow Error - No Relevant Page
You have tried to return to a recent page in the current page flow through return-to="currentPage", 
but there is no appropriate page. 


Exception's stack trace:

Exception: No previous page for return-to="currentPage" on action create in page flow
 /com/gems/mt/web/CreateReleaseCntr/CreateReleaseCntrController.jpf.
com.bea.wlw.netui.pageflow.NoPreviousPageException: No relevant page for return-to="currentPage" 
on action create in page flow /com/gems/mt/web/CreateReleaseCntr/CreateReleaseCntrController.jpf.
at com.bea.wlw.netui.pageflow.FlowController.doReturnToPage(FlowController.java:1328)
at com.bea.wlw.netui.pageflow.FlowController.forwardTo(FlowController.java:1023)
at com.bea.wlw.netui.pageflow.PageFlowController.forwardTo(PageFlowController.java:606)
at com.bea.wlw.netui.pageflow.FlowController.internalExecute(FlowController.java:765)

...


</pre>
				<b>原因分析和解决方法:</b>
				<pre>When a new page flow is created and its current page is null (it mean you visit at the fist time),
 so such an exception like NoPreviousPageException occur if you use return-to="currentPage".

if a new page flow finish a successful forward, it will treat last page as current page

so that we can use current page to display error message conveniently.

Solution:

ensure page flow finish a successful forward and use current page again.

You can also use path="specificPage.jsp" instead of return-to="currentPage" 
if your original return-to is just one specific page.

</pre>
		</div>
<img src ="http://www.blogjava.net/rednight/aggbug/94094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rednight/" target="_blank">rednight</a> 2007-01-16 09:06 <a href="http://www.blogjava.net/rednight/archive/2007/01/16/94094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Memory Leak for ListCellRenderer</title><link>http://www.blogjava.net/rednight/archive/2007/01/16/94089.html</link><dc:creator>rednight</dc:creator><author>rednight</author><pubDate>Tue, 16 Jan 2007 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/rednight/archive/2007/01/16/94089.html</guid><wfw:comment>http://www.blogjava.net/rednight/comments/94089.html</wfw:comment><comments>http://www.blogjava.net/rednight/archive/2007/01/16/94089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rednight/comments/commentRss/94089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rednight/services/trackbacks/94089.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">We have known, the ListCellRenderer interface has only one method <span style="COLOR: blue">public Component getListCellRendererComponent()</span>, and it returns a Component. When a JList needs to compute its dimension or paint its cell item, this method will be called. So it will be called frequently, and we have a best practice, try to reuse object, avoid time-consumed computation and unnecessary operation in this method.</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<?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">
				<span lang="EN-US">Recently found, there is a memory leak bug for list cell renderer in both JDK 1.4.x and JDK 5 (don’t know whether has the same bug in earlier JDK). The component returned from <span style="COLOR: blue">getListCellRendererComponent() </span>method could not be GC, and all its referenced objects also could not be GC. Unfortunately, this bug is only fixed in JDK 6.</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">So currently, if a JList use the ListCellRenderer, but only holds a little resource (eg: the JList only has little items, and the component is returned from ListCellRenderer is a simple JLable), you may not care about the memory leak.</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">But if a JList use the ListCellRenderer, and holds a large resource, you should remember to use the following way to avoid memory leak.</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 1">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US">Work Around: Subclass JList and invoke removeAll after painting is done:<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>public class xxxList extends JList {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">            </span>private CellRendererPane renderer;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">            </span>private CellRendererPane getRenderer() {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                </span>if (renderer == null) {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                    </span>for (int i=0; i&lt;getComponents().length; i++) {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 6">                                          </span>Component c<span style="mso-spacerun: yes">  </span>= getComponents()[i];</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                        </span>if (c instanceof CellRendererPane) {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                            </span>renderer = (CellRendererPane)c;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                            </span>break;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                        </span>}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                    </span>}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                </span>}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                </span>return renderer;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">            </span>}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">            </span>protected void paintComponent(Graphics g) {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                </span>super.paintComponent(g);</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                </span>CellRendererPane renderer = getRenderer();</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                </span>if (renderer != null) {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                    </span>renderer.removeAll();</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                </span>}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">            </span>}</span>
		</p>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">
				<span style="mso-spacerun: yes">        </span>}</span>
		<br />
		<br />
		<br />
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Please refer to <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5044798">http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5044798</a> for more details.</span>
<img src ="http://www.blogjava.net/rednight/aggbug/94089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rednight/" target="_blank">rednight</a> 2007-01-16 09:04 <a href="http://www.blogjava.net/rednight/archive/2007/01/16/94089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>state pattern</title><link>http://www.blogjava.net/rednight/archive/2006/12/26/90105.html</link><dc:creator>rednight</dc:creator><author>rednight</author><pubDate>Tue, 26 Dec 2006 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/rednight/archive/2006/12/26/90105.html</guid><wfw:comment>http://www.blogjava.net/rednight/comments/90105.html</wfw:comment><comments>http://www.blogjava.net/rednight/archive/2006/12/26/90105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rednight/comments/commentRss/90105.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rednight/services/trackbacks/90105.html</trackback:ping><description><![CDATA[
		<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">The logic to change state is only inside one method (initVesselView(…)) inside GrVessel.java.  <br /></span>
		<span lang="EN-US">
				<br />if (viewType == VIEW_STOWAGE) {<br />            vslView_ = new VesselStowageView(leftPoint, bow2Left, leftCenter,<br />                                             rightCenter, shipWidth_);<br />        }<br />        else if (viewType == VIEW_SIDE) {<br />            vslView_ = new VesselSideView(leftPoint, bow2Left, leftCenter,<br />                                          rightCenter, shipWidth_);<br />        }<br />        else if (viewType == VIEW_PLAN) {<br />            vslView_ = new VesselPlanView(leftPoint, bow2Left, leftCenter,<br />                                          rightCenter, shipWidth_);<br />        }<br />        else {<br />            throw new IllegalArgumentException(<br />                "GrVessel::initVesselView--&gt;Invalid view type!");<br />        }<br /><br /><br /></span>
		<font face="Arial" size="2">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">We do not need to repeat this logic of changing view in many other method.</span>
		</font>
		<span lang="EN-US">
				<br />
		</span>
		<font face="Arial" size="2">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">This is the benefit of State design pattern.</span>
		</font>
		<span lang="EN-US">
				<br />
		</span>
		<font face="Arial" size="2">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">The 3 state classes here are VesselPlanView.java, VesselSideView.java and VesselStowageView.java</span>
		</font>
		<span lang="EN-US">
				<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
				<o:p>
				</o:p>
		</span>
		<p>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Please note that in the state classes, if a method is supported by stateA and not supported by stateB.  </span>
				</font>
				<span lang="EN-US">
						<br />
				</span>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Then, in stateB, the method body will throw an exception (IllegalArgumentException) to indicate that coder call the wrong method in the wrong state.</span>
				</font>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Example, in VesselPlanView.java, public boolean addStowage(...).  This method is only meaningful to stowageView.</span>
				</font>
				<span lang="EN-US">
						<br />
						<br />public boolean addStowage(IlvManager manager, List transformList, IlvGraphic stowage, String stadBayN,<br />                              boolean isSelect) {<br />        throw new IllegalArgumentException(<br />                "GrVessel::addStowage--&gt;be sure the vessel at stowage view!");<br />    }<br /><br /><br /></span>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Hence, in PlanView, the method body will throw exception.</span>
				</font>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p>
				<font face="Arial" size="2">
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Just to share with you a better way to code.</span>
				</font>
		</p>
<img src ="http://www.blogjava.net/rednight/aggbug/90105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rednight/" target="_blank">rednight</a> 2006-12-26 14:46 <a href="http://www.blogjava.net/rednight/archive/2006/12/26/90105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Swing 模型过滤</title><link>http://www.blogjava.net/rednight/archive/2006/11/11/80589.html</link><dc:creator>rednight</dc:creator><author>rednight</author><pubDate>Sat, 11 Nov 2006 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/rednight/archive/2006/11/11/80589.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文讨论模型过滤技术。您可将这一技术用于 Swing 组件集，这样即可在不改变底层数据的条件下提供模型数据的不同视图。过滤器可以改变数据元素的外在内容，将数据排除在视图之外、将外部元素包含进数据集中、或者以不同的顺序呈现元素。过滤器既可应用于数据模型，也可应用于状态模型。您还可以叠用过滤器，以将它们的效果组合起来。&nbsp;&nbsp;<a href='http://www.blogjava.net/rednight/archive/2006/11/11/80589.html'>阅读全文</a><img src ="http://www.blogjava.net/rednight/aggbug/80589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rednight/" target="_blank">rednight</a> 2006-11-11 16:16 <a href="http://www.blogjava.net/rednight/archive/2006/11/11/80589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.lang.InstantiationException: org.apache.tools.ant.Main </title><link>http://www.blogjava.net/rednight/archive/2006/11/09/80222.html</link><dc:creator>rednight</dc:creator><author>rednight</author><pubDate>Thu, 09 Nov 2006 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/rednight/archive/2006/11/09/80222.html</guid><wfw:comment>http://www.blogjava.net/rednight/comments/80222.html</wfw:comment><comments>http://www.blogjava.net/rednight/archive/2006/11/09/80222.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rednight/comments/commentRss/80222.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rednight/services/trackbacks/80222.html</trackback:ping><description><![CDATA[有时运行ANT 时会抛出 java.lang.InstantiationException: org.apache.tools.ant.Main 异常<br />原因之一是在机器中存在2种不同版本的ANT,我碰到的情况是classpath 中即有weblogic.jar,又有1.6.5的ANT,<br />删除weblogic.jar后运行就正常了<img src ="http://www.blogjava.net/rednight/aggbug/80222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rednight/" target="_blank">rednight</a> 2006-11-09 18:23 <a href="http://www.blogjava.net/rednight/archive/2006/11/09/80222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>