ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩一区二区三区电影在线观看,久久久综合网站,综合欧美亚洲日本http://www.aygfsteel.com/rednight/0x2B|~0x2B,That's not a question,Just do it.zh-cnFri, 13 Jun 2025 06:42:27 GMTFri, 13 Jun 2025 06:42:27 GMT60消息中间件和JMShttp://www.aygfsteel.com/rednight/archive/2007/04/11/109941.htmlrednightrednightWed, 11 Apr 2007 08:41:00 GMThttp://www.aygfsteel.com/rednight/archive/2007/04/11/109941.htmlhttp://www.aygfsteel.com/rednight/comments/109941.htmlhttp://www.aygfsteel.com/rednight/archive/2007/04/11/109941.html#Feedback0http://www.aygfsteel.com/rednight/comments/commentRss/109941.htmlhttp://www.aygfsteel.com/rednight/services/trackbacks/109941.html当前åQŒCORBA、DCOM、RMI½{‰RPC中间件技术已òq¿æ³›åº”用于各个领域。但是面对规模和复杂度都­‘Šæ¥­‘Šé«˜çš„分布式¾pȝ»ŸåQŒè¿™äº›æŠ€æœ¯ä¹Ÿæ˜„¡¤ºå‡ºå…¶å±€é™æ€§ï¼šåQ?åQ‰åŒæ­¥é€šä¿¡åQšå®¢æˆ·å‘凸™°ƒç”¨åŽåQŒå¿…™åȝ­‰å¾…æœåŠ¡å¯¹è±¡å®Œæˆå¤„ç†åÆˆ˜q”回¾l“果后才能ç‘ô¾l­æ‰§è¡Œï¼›åQ?åQ‰å®¢æˆ·å’ŒæœåŠ¡å¯¹è±¡çš„ç”Ÿå‘½å‘¨æœŸç´§å¯†è€¦åˆåQšå®¢æˆ¯‚¿›½E‹å’ŒæœåŠ¡å¯¹è±¡˜q›ç¨‹éƒ½å¿…™åÀL­£å¸¸è¿è¡Œï¼›å¦‚æžœç”׃ºŽæœåŠ¡å¯¹è±¡å´©æºƒæˆ–è€…ç½‘¾lœæ•…障导致客æˆïLš„è¯äh±‚不可达,客户会接收到异常åQ›ï¼ˆ3åQ‰ç‚¹å¯¹ç‚¹é€šä¿¡åQšå®¢æˆïLš„一‹Æ¡è°ƒç”¨åªå‘送给某个单独的目标对象ã€?
   面向消息的中间äšgåQˆMessage Oriented MiddlewareåQŒMOMåQ‰è¾ƒå¥½çš„解决了以上问题。发送者将消息发送给消息服务器,消息服务器将消息存放在若òq²é˜Ÿåˆ—中åQŒåœ¨åˆé€‚的时候再ž®†æ¶ˆæ¯è{发给接收者。这¿Uæ¨¡å¼ä¸‹åQŒå‘送和接收是异步的åQŒå‘送者无需½{‰å¾…åQ›äºŒè€…的生命周期未必相同åQšå‘送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信åQšå¯¹äºŽä¸€ä¸ªæ¶ˆæ¯å¯ä»¥æœ‰å¤šä¸ªæŽ¥æ”¶è€…ã€?
   已有的MOM¾pȝ»ŸåŒ…括IBMçš„MQSeries、Microsoftçš„MSMQå’ŒBEAçš„MessageQ½{‰ã€‚由于没有一个通用的标准,˜q™äº›¾pȝ»Ÿå¾ˆéš¾å®žçŽ°äº’æ“ä½œå’Œæ— ç¼˜qžæŽ¥ã€‚Java Message ServiceåQˆJMSåQ‰æ˜¯SUN提出的旨在统一各种MOM¾pȝ»ŸæŽ¥å£çš„规范,它包含点对点åQˆPoint to PointåQŒPTPåQ‰å’Œå‘布/订阅åQˆPublish/SubscribeåQŒpub/subåQ‰ä¸¤¿Uæ¶ˆæ¯æ¨¡åž‹ï¼Œæä¾›å¯é æ¶ˆæ¯ä¼ è¾“、事务和消息˜q‡æ×o½{‰æœºåˆ¶ã€?/font>

1.JMS
   JAVA 消息服务(JMS)定义了Java 中访问消息中间äšg的接口。JMS 只是接口åQŒåƈ没有¾l™äºˆå®žçްåQŒå®žçްJMS 接口的消息中间äšg¿UîCØ“JMS ProvideråQŒiLink实现了JMS接口åQŒç”¨æˆ·å¯ä»¥é€šè¿‡ä½¿ç”¨JMS接口åQŒåœ¨iLink中进行JMS¾~–程ã€?iLink支持JMS1.0.2版本ã€?

2.JMS接口描述
   JMS 支持两种消息¾cÕdž‹PTP å’ŒPub/SubåQŒåˆ†åˆ«ç§°ä½œï¼šPTP Domain å’ŒPub/Sub DomainåQŒè¿™ä¸¤ç§æŽ¥å£éƒ½ç‘ô承统一的JMS父接口,JMS 主要接口如下所½Cºï¼š

MS父接�/font>

PTP

Pub/Sub

ConnectionFactory

QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Destination

Queue

Topic

Session

QueueSession

TopicSession

MessageProducer

QueueSender

TopicPublisher

MessageConsumer

QueueReceiver,QueueBrowse r

TopicSubscriber

 

 

 

                  
   ConnectionFactory åQšè¿žæŽ¥å·¥åŽ‚ï¼ŒJMS 用它创徏˜qžæŽ¥
   Connection åQšJMS 客户端到JMS Provider 的连æŽ?br>   Destination åQšæ¶ˆæ¯çš„ç›®çš„åœ?br>   SessionåQ?一个发送或接收消息的线½E?br>   MessageProduceråQ?ç”±Session 对象创徏的用来发送消息的对象
   MessageConsumeråQ?ç”±Session 对象创徏的用来接收消息的对象

3.JMS消息模型
JMS 消息ç”׃»¥ä¸‹å‡ éƒ¨åˆ†¾l„成åQšæ¶ˆæ¯å¤´åQŒå±žæ€§ï¼Œæ¶ˆæ¯ä½“ã€?br>  
3.1 消息å¤?Header) - 消息头包含消息的识别信息和èµ\ç”׃¿¡æ¯ï¼Œæ¶ˆæ¯å¤´åŒ…含一些标准的属性如åQšJMSDestination,JMSMessageID ½{‰ã€?

 æ¶ˆæ¯å¤?/font>

 ç”Þp°è®„¡½®

JMSDestination

send æˆ?publish æ–ÒŽ³•

JMSDeliveryMode

send æˆ?publish æ–ÒŽ³•

JMSExpiration

send æˆ?publish æ–ÒŽ³•

JMSPriority

send æˆ?publish æ–ÒŽ³•

JMSMessageID

send æˆ?publish æ–ÒŽ³•

JMSTimestamp

send æˆ?publish æ–ÒŽ³•

JMSCorrelationID

客户

JMSReplyTo

客户

JMSType

客户

JMSRedelivered

JMS Provider

 

 

        
 

 

 

      


3.2 属�Properties)
- 除了消息头中定义好的标准属性外åQŒJMS 提供一¿Uæœºåˆ¶å¢žåŠ æ–°å±žæ€§åˆ°æ¶ˆæ¯å¤?中,˜q™ç§æ–°å±žæ€§åŒ…含以下几¿Uï¼š
   1. 应用需要用到的属æ€?
   2. 消息头中原有的一些可选属æ€?
   3. JMS Provider 需要用到的属性ã€?br>   标准的JMS 消息头包含以下属性:

JMSDestination

消息发送的目的�/font>

JMSDeliveryMode

传递模式, 有两¿Uæ¨¡å¼ï¼š PERSISTENT å’ŒNON_PERSISTENTåQŒPERSISTENT 表示该消息一定要被送到目的圎ͼŒå¦åˆ™ä¼šå¯¼è‡´åº”用错误。NON_PERSISTENT 表示偶然丢失该消息是被允许的åQŒè¿™ä¸¤ç§æ¨¡å¼ä½¿å¼€å‘者可以在消息传递的可靠性和吞吐量之间找到åã^衡点ã€?/font>

JMSMessageID

唯一识别每个消息的标识,由JMS Provider 产生�/font>

JMSTimestamp

一个消息被提交¾l™JMS Provider 到消息被发出的时间ã€?/font>

JMSCorrelationID

用来˜qžæŽ¥åˆ°å¦å¤–一个消息,典型的应用是在回复消息中˜qžæŽ¥åˆ°åŽŸæ¶ˆæ¯ã€?/font>

JMSReplyTo

提供本消息回复消息的目的地址

JMSRedelivered

如果一个客æˆïL«¯æ”¶åˆ°ä¸€ä¸ªè®¾¾|®äº†JMSRedelivered 属性的消息åQŒåˆ™è¡¨ç¤ºå¯èƒ½è¯¥å®¢æˆïL«¯æ›„¡»åœ¨æ—©äº›æ—¶å€™æ”¶åˆ°è¿‡è¯¥æ¶ˆæ¯ï¼Œä½†åƈ没有½{¾æ”¶(acknowledged)ã€?/font>

JMSType

消息¾cÕdž‹çš„识别符ã€?/font>

JMSExpiration

消息˜q‡æœŸæ—‰™—´åQŒç­‰äºŽQueueSender çš„send æ–ÒŽ³•中的timeToLive 值或TopicPublisher çš„publish æ–ÒŽ³•中的timeToLive 值加上发送时åˆÈš„GMT æ—‰™—´å€¹{€‚如果timeToLive值等于零åQŒåˆ™JMSExpiration 被设为零åQŒè¡¨½Cø™¯¥æ¶ˆæ¯æ°æ€¸˜q‡æœŸã€‚如果发送后åQŒåœ¨æ¶ˆæ¯˜q‡æœŸæ—‰™—´ä¹‹åŽæ¶ˆæ¯˜q˜æ²¡æœ‰è¢«å‘送到目的圎ͼŒåˆ™è¯¥æ¶ˆæ¯è¢«æ¸…除ã€?/font>

JMSPriority

消息优先¾U§ï¼Œä»?-9 十个¾U§åˆ«åQ?-4 是普通消息,5-9 是加急消息。JMS 不要求JMS Provider 严格按照˜q™åä¸ªä¼˜å…ˆçñ”发送消息,但必™åÖM¿è¯åŠ æ€¥æ¶ˆæ¯è¦å…ˆäºŽæ™®é€šæ¶ˆæ¯åˆ°è¾¾ã€?/font>

 

 

 

 

 

 

 

 

 

 



3.3 消息ä½?Body) - JMS API 定义äº?¿Uæ¶ˆæ¯ä½“格式åQŒä¹Ÿå«æ¶ˆæ¯ç±»åž‹ï¼Œä½ å¯ä»¥ä‹É用不同åŞ式发送接æ”?数据òq¶å¯ä»¥å…¼å®¹çŽ°æœ‰çš„æ¶ˆæ¯æ ¼å¼åQŒä¸‹é¢æ˜q°è¿™5¿Uç±»åž‹ï¼š

消息¾cÕdž‹

消息�/font>

TextMessage

java.lang.String对象åQŒå¦‚xmlæ–‡äšg内容

MapMessage

å?值对的集合,名是String对象åQŒå€¼ç±»åž‹å¯ä»¥æ˜¯Javaä»ÖM½•基本¾cÕdž‹

BytesMessage

字节‹¹?/font>

StreamMessage

Java中的输入输出‹¹?/font>

ObjectMessage

Java中的可序列化对象

Message

没有消息体,只有消息头和属�/font>













下例演示创徏òq¶å‘送一个TextMessageåˆîC¸€ä¸ªé˜Ÿåˆ—:
TextMessage message = queueSession.createTextMessage();
message.setText(msg_text); // msg_text is a String
queueSender.send(message);

下例演示接收消息òq¶è{æ¢äØ“åˆé€‚çš„æ¶ˆæ¯¾cÕdž‹åQ?
Message m = queueReceiver.receive();
if (m instanceof TextMessage) {
 TextMessage message = (TextMessage) m;
 System.out.println("Reading message: " + message.getText());
} else {
 // Handle error
}

4. 消息的同步异步接æ”?br>   消息的同步接收是指客æˆïL«¯ä¸ÕdЍåŽÀLŽ¥æ”¶æ¶ˆæ¯ï¼ŒJMS 客户端可以采用MessageConsumer çš„receiveæ–ÒŽ³•åŽÀLŽ¥æ”¶ä¸‹ä¸€ä¸ªæ¶ˆæ¯ã€?br>   消息的异步接收是指当消息到达æ—Óž¼Œä¸ÕdŠ¨é€šçŸ¥å®¢æˆ·ç«¯ã€‚JMS 客户端可以通过注册一个实 现MessageListener 接口的对象到MessageConsumeråQŒè¿™æ øP¼Œæ¯å½“消息到达æ—Óž¼ŒJMS Provider 会调用MessageListener中的onMessage æ–ÒŽ³•ã€?

5. PTP模型
PTP(Point-to-Point)模型是基于队列的åQŒå‘送方发消息到队列åQŒæŽ¥æ”¶æ–¹ä»Žé˜Ÿåˆ—接收消息,队列的存在ä‹Éå¾—æ¶ˆæ¯çš„å¼‚æ­¥ä¼ è¾“æˆäØ“å¯èƒ½ã€‚å’Œé‚®äšg¾pȝ»Ÿä¸­çš„é‚®ç®±ä¸€æ øP¼Œé˜Ÿåˆ—可以包含各种消息åQŒJMS Provider æ?供工å…ïL®¡ç†é˜Ÿåˆ—的创徏、删除。JMS PTP 模型定义了客æˆïL«¯å¦‚何向队列发送消息,从队列接收消息,‹¹è§ˆé˜Ÿåˆ—中的消息ã€?br>   下面描述JMS PTP 模型中的主要概念和对象:

名称

描述

Queue

ç”±JMS Provider ½Ž¡ç†åQŒé˜Ÿåˆ—由队列名识别,客户端可以通过JNDI 接口用队列名得到一个队列对象ã€?/font>

TemporaryQueue

ç”±QueueConnection 创徏åQŒè€Œä¸”只能由创建它的QueueConnection 使用ã€?/font>

QueueConnectionFactory

客户端用QueueConnectionFactory 创徏QueueConnection 对象�/font>

QueueConnection

一个到JMS PTP provider 的连接,客户端可以用QueueConnection 创徏QueueSession 来发送和接收消息�/font>

QueueSession

提供一些方法创建QueueReceiver 、QueueSender、QueueBrowser å’ŒTemporaryQueue。如果在QueueSession 关闭æ—Óž¼Œæœ‰ä¸€äº›æ¶ˆæ¯å·²¾lè¢«æ”¶åˆ°åQŒä½†˜q˜æ²¡æœ‰è¢«½{¾æ”¶(acknowledged)åQŒé‚£ä¹ˆï¼Œå½“接收者下‹Æ¡è¿žæŽ¥åˆ°ç›¸åŒçš„队列时åQŒè¿™äº›æ¶ˆæ¯è¿˜ä¼šè¢«å†æ¬¡æŽ¥æ”¶ã€?/font>

QueueReceiver

客户端用QueueReceiver 接收队列中的消息åQŒå¦‚果用户在QueueReceiver 中设定了消息选择条äšgåQŒé‚£ä¹ˆä¸½W¦åˆæ¡äšg的消息会留在队列中,不会被接收到ã€?/font>

QueueSender

客户端用QueueSender 发送消息到队列�/font>

QueueBrowser

客户端可以QueueBrowser ‹¹è§ˆé˜Ÿåˆ—中的消息åQŒä½†ä¸ä¼šæ”¶èµ°æ¶ˆæ¯ã€?/font>

QueueRequestor

JMS 提供QueueRequestor ¾cȝ®€åŒ–消息的收发˜q‡ç¨‹ã€‚QueueRequestor 的构造函数有两个参数åQšQueueSession å’ŒqueueåQŒQueueRequestor 通过创徏一个äÍæ—‰™˜Ÿåˆ—来完成最¾lˆçš„æ”¶å‘消息è¯äh±‚ã€?/font>

可靠�Reliability)

队列可以长久åœîC¿å­˜æ¶ˆæ¯ç›´åˆ°æŽ¥æ”¶è€…收到消息。接收者不需要因为担心消息会丢失而时åˆÕd’Œé˜Ÿåˆ—保持‹È€‹zȝš„˜qžæŽ¥çŠ¶æ€ï¼Œå……åˆ†ä½“çŽ°äº†å¼‚æ­¥ä¼ è¾“æ¨¡å¼çš„ä¼˜åŠ¿ã€?/font>



              
          
  
 

 

 

 

 

 

 

 

 


6. PUB/SUB模型
JMS Pub/Sub 模型定义了如何向一个内容节点发布和订阅消息åQŒè¿™äº›èŠ‚ç‚¹è¢«¿UîC½œä¸»é¢˜(topic)ã€?br>   主题可以被认为是消息的传输中介,发布è€?publisher)发布消息åˆîC¸»é¢˜ï¼Œè®¢é˜…è€?subscribe)从主题订阅消息。主题ä‹É得消息订阅者和消息发布者保持互相独立,不需要接触即可保证消息的传送ã€?br>   下面描述JMS Pub/Sub 模型中的主要概念和对象:

名称

描述

订阅(subscription)

æ¶ˆæ¯è®¢é˜…åˆ†äØ“éžæŒä¹…è®¢é˜?non-durable subscription)和持久订é˜?durable subscrip-tion)åQŒéžæŒä¹…订阅只有当客æˆïL«¯å¤„于‹È€‹zÈŠ¶æ€ï¼Œä¹Ÿå°±æ˜¯å’ŒJMS Provider 保持˜qžæŽ¥çŠ¶æ€æ‰èƒ½æ”¶åˆ°å‘é€åˆ°æŸä¸ªä¸»é¢˜çš„æ¶ˆæ¯ï¼Œè€Œå½“å®¢æˆ·ç«¯å¤„äºŽç¦»¾U¿çŠ¶æ€ï¼Œ˜q™ä¸ªæ—‰™—´ŒDµå‘åˆîC¸»é¢˜çš„æ¶ˆæ¯ž®†ä¼šä¸¢å¤±åQŒæ°¸˜qœä¸ä¼šæ”¶åˆ°ã€‚持久订阅时åQŒå®¢æˆïL«¯å‘JMS 注册一个识别自å·Þpín份的IDåQŒå½“˜q™ä¸ªå®¢æˆ·ç«¯å¤„于离¾U¿æ—¶åQŒJMS Provider ä¼šäØ“˜q™ä¸ªID 保存所有发送到主题的消息,当客户再‹Æ¡è¿žæŽ¥åˆ°JMS Provideræ—Óž¼Œä¼šæ ¹æ®è‡ªå·Þqš„ID 得到所有当自己处于¼›Èº¿æ—¶å‘送到主题的消息ã€?/font>

Topic

主题由JMS Provider ½Ž¡ç†åQŒä¸»é¢˜ç”±ä¸»é¢˜åè¯†åˆ«ï¼Œå®¢æˆ·ç«¯å¯ä»¥é€šè¿‡JNDI 接口用主题名得到一个主题对象。JMS 没有¾l™å‡ºä¸»é¢˜çš„组¾l‡å’Œå±‚次¾l“构的定义,由JMS Provider 自己定义ã€?/font>

TemporaryTopic

临时主题由TopicConnection 创徏åQŒè€Œä¸”只能由创建它的TopicConnection 使用。äÍ时主题不能提供持久订阅功能ã€?/font>

TopicConnectionFactory

客户端用TopicConnectionFactory 创徏TopicConnection 对象�/font>

TopicConnection

TopicConnection 是一个到JMS Pub/Sub provider 的连接,客户端可以用TopicConnection创徏TopicSession 来发布和订阅消息�/font>

TopicSession

TopicSession 提供一些方法创建TopicPublisher、TopicSubscriber、TemporaryTopic 。它˜q˜æä¾›unsubscribe æ–ÒŽ³•取消消息的持久订阅ã€?/font>

TopicPublisher

客户端用TopicPublisher 发布消息åˆîC¸»é¢˜ã€?/font>

TopicSubscriber

客户端用TopicSubscriber 接收发布åˆîC¸»é¢˜ä¸Šçš„æ¶ˆæ¯ã€‚可以在TopicSubscriber 中设¾|®æ¶ˆæ¯è¿‡æ»¤åŠŸèƒ½ï¼Œ˜q™æ ·åQŒä¸½W¦åˆè¦æ±‚的消息不会被接收ã€?/font>

Durable TopicSubscriber

如果一个客æˆïL«¯éœ€è¦æŒä¹…订阅消息,可以使用Durable TopicSubscriberåQŒTopSession 提供一个方法createDurableSubscriber创徏Durable TopicSubscriber 对象ã€?/font>

恢复和重新派�Recovery and Redelivery)

非持久订阅状态下åQŒä¸èƒ½æ¢å¤æˆ–重新‹zùN€ä¸€ä¸ªæœª½{¾æ”¶çš„æ¶ˆæ¯ã€‚只有持久订阅才能恢复或重新‹zùN€ä¸€ä¸ªæœª½{¾æ”¶çš„æ¶ˆæ¯ã€?/font>

TopicRequestor

JMS 提供TopicRequestor ¾cȝ®€åŒ–消息的收发˜q‡ç¨‹ã€‚TopicRequestor 的构造函数有两个参数åQšTopicSession å’Œtopic。TopicRequestor 通过创徏一个äÍ时主题来完成最¾lˆçš„发布和接收消息请求ã€?/font>

可靠�Reliability)

当所有的消息必须被接æ”Óž¼Œåˆ™ç”¨æŒä¹…订阅模式。当丢失消息能够被容忍,则用非持久订阅模式ã€?/font>

 

 

 

 

 

 

 


 

 


 
 
 
 
 
 
 
 
 




7. 开发JMS的步�br>
   òq¿ä¹‰ä¸Šè¯´åQŒä¸€ä¸ªJMS 应用是几个JMS 客户端交换消息,开发JMS 客户端应用由以下几步构成åQ?
用JNDI 得到ConnectionFactory 对象åQ?
用JNDI 得到目标队列或主题对象,即Destination 对象åQ?
用ConnectionFactory 创徏Connection 对象åQ?
用Connection 对象创徏一个或多个JMS SessionåQ?
用Session å’ŒDestination 创徏MessageProducer å’ŒMessageConsumeråQ?
通知Connection 开始传递消息�/font>



]]>
¾lå¸¸¼„°åˆ°xmlæ–‡äšg解析错误可以考虑是不是由于文本编辑器而导致的问题http://www.aygfsteel.com/rednight/archive/2007/01/16/94099.htmlrednightrednightTue, 16 Jan 2007 01:09:00 GMThttp://www.aygfsteel.com/rednight/archive/2007/01/16/94099.htmlhttp://www.aygfsteel.com/rednight/comments/94099.htmlhttp://www.aygfsteel.com/rednight/archive/2007/01/16/94099.html#Feedback0http://www.aygfsteel.com/rednight/comments/commentRss/94099.htmlhttp://www.aygfsteel.com/rednight/services/trackbacks/94099.html问题描述:
    <[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).>
    <[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)
>
原因分析和解å†Ïx–¹æ³?
是由于某些文本编辑器åQˆUltraEditåQ‰å­˜æ–‡æœ¬çš„æ—¶å€™äñ”生的问题。可以ä‹É用text pad, word pad¾~–辑XML格式的文件ã€?


]]>
有时WLS-Apache Proxy Pluginç”׃ºŽtimeout的设¾|®è¿‡çŸ­è€Œè®¤ä¸ºå¤„理它转发è¯äh±‚的应用服务器æ­ÀLŽ‰äº†è€Œè¿›è¡ŒFailvoerhttp://www.aygfsteel.com/rednight/archive/2007/01/16/94098.htmlrednightrednightTue, 16 Jan 2007 01:09:00 GMThttp://www.aygfsteel.com/rednight/archive/2007/01/16/94098.htmlhttp://www.aygfsteel.com/rednight/comments/94098.htmlhttp://www.aygfsteel.com/rednight/archive/2007/01/16/94098.html#Feedback0http://www.aygfsteel.com/rednight/comments/commentRss/94098.htmlhttp://www.aygfsteel.com/rednight/services/trackbacks/94098.html问题描述:
通过HTTP提交EDIè¯äh±‚,当EDI处理旉™—´­‘…过äº?0分钟å?ž®×ƒ¼šçœ‹åˆ°åœ¨å¦ä¸€ä¸ªweblogic server也接收到了这个EDIè¯äh±‚,重新处理˜q™ä¸ªæŠ¥æ–‡.
如果报文处理旉™—´æ›´é•¿,比如­‘…过äº?0分钟,ž®×ƒ¼šå‘现˜q™ä¸ªæŠ¥æ–‡è¢«å¤„理了3遍或5é?
原因分析和解å†Ïx–¹æ³?
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 推荐的,˜q™ä¸ªå€¼åº”该设得大一äº? ˜q™ä¸ªå‚数的缺省å€égØ“300s. 见下面:
<Location /EDIHandler>
         SetHandler weblogic-handler
         WebLogicCluster apc_app1wls1:7011,apc_app1wls2:7011
         KeepAliveEnabled ON
         WLIOTimeoutSecs 7200
</Location>


]]>
Failed to Send MQ Message Problemhttp://www.aygfsteel.com/rednight/archive/2007/01/16/94097.htmlrednightrednightTue, 16 Jan 2007 01:08:00 GMThttp://www.aygfsteel.com/rednight/archive/2007/01/16/94097.htmlhttp://www.aygfsteel.com/rednight/comments/94097.htmlhttp://www.aygfsteel.com/rednight/archive/2007/01/16/94097.html#Feedback0http://www.aygfsteel.com/rednight/comments/commentRss/94097.htmlhttp://www.aygfsteel.com/rednight/services/trackbacks/94097.html有时候ä‹É用的mq jaræ–‡äšg的版本不对给出现一些末名奇妙的问题,本文则是能接收消息但不能发送消息的一个问é¢?¼„°åˆ°˜q™æ ·çš„问题一定要记得double-checkä½ ä‹É用的mq jaræ–‡äšg的版æœ?/p>

问题描述:
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**************

原因分析和解å†Ïx–¹æ³?
It may be caused by use of old version MQ jar. It can receive message, but cannot send message.


]]>
Cannot Forward a Response that is Already Committedhttp://www.aygfsteel.com/rednight/archive/2007/01/16/94096.htmlrednightrednightTue, 16 Jan 2007 01:07:00 GMThttp://www.aygfsteel.com/rednight/archive/2007/01/16/94096.htmlhttp://www.aygfsteel.com/rednight/comments/94096.htmlhttp://www.aygfsteel.com/rednight/archive/2007/01/16/94096.html#Feedback5http://www.aygfsteel.com/rednight/comments/commentRss/94096.htmlhttp://www.aygfsteel.com/rednight/services/trackbacks/94096.html如果你碰åˆ?Cannot Forward a Response that is Already Committed"˜q™æ ·çš„错误信æ?一定是应用对一‹Æ¡httpè¯äh±‚做了多次™åµé¢è·Œ™{或对response对象做过closeå?又去写响åº?

˜q™ä¸ªé—®é¢˜çš„æ ¹æœ¬åŽŸå› ç”±äºŽå“åº”æœ¬‹Æ¡è¯·æ±‚çš„Response对象的状态是已提交状态造成çš? 它不允许响应提交多次ã€?

什么时候Response对象的状态变成已提交状态:当你的应用已¾lå®žçŽîCº†™åµé¢è·Œ™{逻辑ã€?

通常原因åQ?

1åQ?如果你ä‹É用了community的话åQ?community的安全认证和授权如果没有通过åQŒcommunity内部会进行页面蟩转。但你的应用(对于workshop应用的话åQŒæŒ‡çš„æ˜¯action)又试图进行页面蟩转,ž®×ƒ¼šå‡ºçް˜q™æ ·çš„问题ã€?


    /**

     * @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, ""));

      //˜q™ä¸ªè°ƒç”¨å¯èƒ½å®žçŽ°äº†é¡µé¢èŸ©è½¬ï¼ŒåÏxäº¤å“åº?

}

 

注意JSP中实现页面蟩转后åQŒåŠ return 语句防止¾l§ç®‹æäº¤å“åº”:

 

<%

       SecurityManager.checkAuthorization(getRequest(), getResponse(), config.getString(

                CDConstants.CREATE_TERM_ACTION_NAME, ""));

{

     //可能有实现页面蟩转逻辑

    ……………forward();

        return;//记得加retrun.

    }

%>

 

2. .如果没有使用community的话åQŒä¸‹é¢æƒ…景也会出现这个问é¢?

 

    /**

     * @jpf:action

     * @jpf:forward name="page" path="page.jsp"

     */

    protected Forward actionMethod()

 

//直接操作Response对象写响�

     getResponse().getPrintWriter().println();

    …

/

   // 又执行的™åµé¢è·Œ™{åQŒä¹Ÿå¯èƒ½å‡ºçŽ°é—®é¢˜

        return new Forward("index");

    }


]]>
Page Flow Error - No Relevant Pagehttp://www.aygfsteel.com/rednight/archive/2007/01/16/94094.htmlrednightrednightTue, 16 Jan 2007 01:06:00 GMThttp://www.aygfsteel.com/rednight/archive/2007/01/16/94094.htmlhttp://www.aygfsteel.com/rednight/comments/94094.htmlhttp://www.aygfsteel.com/rednight/archive/2007/01/16/94094.html#Feedback0http://www.aygfsteel.com/rednight/comments/commentRss/94094.htmlhttp://www.aygfsteel.com/rednight/services/trackbacks/94094.html一个页面流在第一‹Æ¡ä‹É用时,内部属性currentpageòq¶æ²¡æœ‰æŒ‡å®šé¡µé?所以避免在beginæ–ÒŽ³•里ä‹É用return-to: current page用法.同时在用的时候注意页面流的工作方å¼?/p>

问题描述:
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)

...


原因分析和解å†Ïx–¹æ³?
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.



]]>
Memory Leak for ListCellRendererhttp://www.aygfsteel.com/rednight/archive/2007/01/16/94089.htmlrednightrednightTue, 16 Jan 2007 01:04:00 GMThttp://www.aygfsteel.com/rednight/archive/2007/01/16/94089.htmlhttp://www.aygfsteel.com/rednight/comments/94089.htmlhttp://www.aygfsteel.com/rednight/archive/2007/01/16/94089.html#Feedback0http://www.aygfsteel.com/rednight/comments/commentRss/94089.htmlhttp://www.aygfsteel.com/rednight/services/trackbacks/94089.html We have known, the ListCellRenderer interface has only one method public Component getListCellRendererComponent(), 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.

 

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 getListCellRendererComponent() method could not be GC, and all its referenced objects also could not be GC. Unfortunately, this bug is only fixed in JDK 6.

 

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.

 

But if a JList use the ListCellRenderer, and holds a large resource, you should remember to use the following way to avoid memory leak.

 

Work Around: Subclass JList and invoke removeAll after painting is done:

       public class xxxList extends JList {

            private CellRendererPane renderer;

            private CellRendererPane getRenderer() {

                if (renderer == null) {

                    for (int i=0; i<getComponents().length; i++) {

                                          Component c  = getComponents()[i];

                        if (c instanceof CellRendererPane) {

                            renderer = (CellRendererPane)c;

                            break;

                        }

                    }

                }

                return renderer;

            }

            protected void paintComponent(Graphics g) {

                super.paintComponent(g);

                CellRendererPane renderer = getRenderer();

                if (renderer != null) {

                    renderer.removeAll();

                }

            }

        }


Please refer to http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5044798 for more details.

]]>
state patternhttp://www.aygfsteel.com/rednight/archive/2006/12/26/90105.htmlrednightrednightTue, 26 Dec 2006 06:46:00 GMThttp://www.aygfsteel.com/rednight/archive/2006/12/26/90105.htmlhttp://www.aygfsteel.com/rednight/comments/90105.htmlhttp://www.aygfsteel.com/rednight/archive/2006/12/26/90105.html#Feedback0http://www.aygfsteel.com/rednight/comments/commentRss/90105.htmlhttp://www.aygfsteel.com/rednight/services/trackbacks/90105.htmlThe logic to change state is only inside one method (initVesselView(�) inside GrVessel.java. 

if (viewType == VIEW_STOWAGE) {
            vslView_ = new VesselStowageView(leftPoint, bow2Left, leftCenter,
                                             rightCenter, shipWidth_);
        }
        else if (viewType == VIEW_SIDE) {
            vslView_ = new VesselSideView(leftPoint, bow2Left, leftCenter,
                                          rightCenter, shipWidth_);
        }
        else if (viewType == VIEW_PLAN) {
            vslView_ = new VesselPlanView(leftPoint, bow2Left, leftCenter,
                                          rightCenter, shipWidth_);
        }
        else {
            throw new IllegalArgumentException(
                "GrVessel::initVesselView-->Invalid view type!");
        }


We do not need to repeat this logic of changing view in many other method.
This is the benefit of State design pattern.
The 3 state classes here are VesselPlanView.java, VesselSideView.java and VesselStowageView.java

Please note that in the state classes, if a method is supported by stateA and not supported by stateB. 
Then, in stateB, the method body will throw an exception (IllegalArgumentException) to indicate that coder call the wrong method in the wrong state.

Example, in VesselPlanView.java, public boolean addStowage(...).  This method is only meaningful to stowageView.

public boolean addStowage(IlvManager manager, List transformList, IlvGraphic stowage, String stadBayN,
                              boolean isSelect) {
        throw new IllegalArgumentException(
                "GrVessel::addStowage-->be sure the vessel at stowage view!");
    }


Hence, in PlanView, the method body will throw exception.

Just to share with you a better way to code.



]]>
Swing 模型˜q‡æ×ohttp://www.aygfsteel.com/rednight/archive/2006/11/11/80589.htmlrednightrednightSat, 11 Nov 2006 08:16:00 GMThttp://www.aygfsteel.com/rednight/archive/2006/11/11/80589.html阅读全文

]]>
java.lang.InstantiationException: org.apache.tools.ant.Main http://www.aygfsteel.com/rednight/archive/2006/11/09/80222.htmlrednightrednightThu, 09 Nov 2006 10:23:00 GMThttp://www.aygfsteel.com/rednight/archive/2006/11/09/80222.htmlhttp://www.aygfsteel.com/rednight/comments/80222.htmlhttp://www.aygfsteel.com/rednight/archive/2006/11/09/80222.html#Feedback1http://www.aygfsteel.com/rednight/comments/commentRss/80222.htmlhttp://www.aygfsteel.com/rednight/services/trackbacks/80222.html原因之一是在机器中存åœ?¿Uä¸åŒç‰ˆæœ¬çš„ANT,我碰到的情况是classpath 中即有weblogic.jar,又有1.6.5çš„ANT,
删除weblogic.jar后运行就正常�img src ="http://www.aygfsteel.com/rednight/aggbug/80222.html" width = "1" height = "1" />

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÑÓ½òÏØ| Æ½ÈªÏØ| ɽµ¤ÏØ| ÓÀÐËÏØ| ·öËçÏØ| ´óÖñÏØ| ÌúÁëÊÐ| ¹ãË®ÊÐ| ¹«Ö÷ÁëÊÐ| Ðû»¯ÏØ| ÆÁÉ½ÏØ| ¹Ê³ÇÏØ| Âí°°É½ÊÐ| Þ­´ºÏØ| ÁÙ¸ßÏØ| ᯹®ÏØ| ·ÊÏçÏØ| ³çÀñÏØ| ÂêÄÉË¹ÏØ| Ë«ÁÉÊÐ| ¿µÆ½ÏØ| °¢ÈÙÆì| Ìì¾þÏØ| ÃáÄþÏØ| ¾²°²Çø| Æ½Ò£ÏØ| ÈÊ»³ÊÐ| ÉîÛÚÊÐ| º£ÑÎÏØ| ÃçÀõÏØ| »ÝÀ´ÏØ| ÃÖÀÕÏØ| µÂ»¯ÏØ| ÄþÎäÏØ| º×±ÚÊÐ| ÄÏľÁÖÏØ| Àè³ÇÏØ| °ÝÈªÏØ| ÄÏÆ½ÊÐ| À´±öÊÐ| ÃÉÉ½ÏØ|