调解编程的编码技巧
编写调解代码时可帮到您的编程提示。
- 请注意避免在正向路由路径中产生循环。例如,如果将路径中的目标设置为与当前目标相同,那么消息将不断地循环,每次都将路由路径复位成当前目标。调解框架不会检查路由路径中是否存在循环。
- 尽可能避免使用静态字段。可以部署单个调解来同时处理多条消息。
- 不要高速缓存根据消息上下文或消息内容计算出来的值。这些值可能会随消息不同而不同。一种例外情况是,为了提高性能而只对从调解处理程序属性派生的值进行高速缓存。
- 调解编程与编写 EJB 具有相同的限制。有关这些限制的更多信息,请参阅 EJB 1.1 规范中的 18.1.2 这一节。
- 对调解选择适当级别的事务性控制:例如,对一条消息中的字段执行操作的调解不太可能牵连到事务性控制。在另一个极端,如果调解将更新数据库字段,那么它需要事务性控制,并且您应提醒管理员在调解定义中设置 UseGlobalTransaction 标志。此标志缺省为 False 值。
- 特地应用于消息格式的提示:
- 在调解功能已对消息执行操作之后,最好是检查该消息是否符合期望的格式。应该使用 SIMessage 接口中的 isWellFormed 方法来检查是否所有消息属性值都可序列化,并且消息的数据图符合消息的格式。
- 根据您想要如何处理消息,可指定满足需要的格式而不接受自然的格式。例如,如果您想要将 SOAP 消息作为字节字符串来处理,那么使用 SIMessage 接口中的 getNewDataGraph 方法并指定格式 JMS/bytes。getNewDataGraph 将返回新的 SDO 数据图,该数据图包含由格式字段指定的树形表示中 SIMessage 有效内容的副本,在此示例中,是作为字节字符串处理的。
- 最好是检查调解代码中的消息格式,这是因为调解不太可能成功地处理具有意外格式的消息。在 SIMessage 接口上使用 getFormat 方法。
- 调解支持的 SDO 版本只有 V1。
- 由于 SDO 用户界面中存在对消息的限制,消息访问方法没有任何 "throws" 子句。因此,由于产生语法分析错误而由访问方法抛出的异常是未经检查的异常。通过检查 com.ibm.websphere.sib.exception 包中的异常类 SIMessageParseException,调解就可以捕获语法分析异常。使用类似于以下示例的代码:
try { // Function involving SDO message access } catch (SIMessageParseException e) { // Look at the real cause of the runtime exception, and act on it. // It is likely to indicate a parse failure... Throwable cause = e.getCause(); }
注: 如果调解不捕获 SIMessageParseException,那么会将原始版本的消息发送至异常目标。 - 当部署调解时,为处理程序和处理程序列表指定容易记忆和描述性的名称。
- 当对单个目标部署单个调解时,在管理控制台中对调解处理程序、调解处理程序列表和调解对象使用完全相同的名称。
- 由于性能方面的原因,指定选择器规则,以便仅调解经过目标的消息的必需子集。