科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道WebLogic Server 9.2 中的JMS客户端存储转发机制

WebLogic Server 9.2 中的JMS客户端存储转发机制

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Weblogic Server 9.2中的JMS SAF 客户端功能将在 WebLogic Server 9.0 中引入的JMS存储转发服务扩展为独立 JMS 客户端。通过使用标准 JNDI 查找,JMS SAF客户端会自动启动并查找配置文件中指定的服务器端JMS连接工厂和目标。

来源:dev2dev 2007年10月16日

关键字: 应用 技术 Weblogic 中间件

  • 评论
  • 分享微博
  • 分享邮件

  Weblogic Server 9.2中的JMS SAF 客户端功能将在 WebLogic Server 9.0 中引入的 JMS 存储转发服务扩展为独立 JMS 客户端。现在,即使在 JMS 客户端无法到达目标时(例如,由于网络连接暂时失败),该客户端也能够可靠地将消息发送到服务器端 JMS 目标。与服务器断开连接后,JMS SAF 客户端发送的消息会以本地方式存储在客户端文件系统中,并在该客户端重新连接时转发到服务器端 JMS 目标。JMS SAF 客户端功能包括两个主要部分:将消息直接写入本地文件系统中的客户端持久性存储的 JMS SAF 客户端实现,以及获取写入存储的消息并将其发送到 WebLogic Server 实例的 SAF 转发器。本文通过一个示例使用WebLogic Server 9.2自带的Example Domain来演示如何使用JMS客户端存储转发机制。

  一、背景知识

  存储转发 (Store and Forward,SAF)是在WebLogic Server 9.0 中引入的一个新特性。通过 SAF 服务,WebLogic Server 能在分布于 WebLogic Server 实例中的应用程序之间可靠地传递消息。例如,通过 SAF 服务,运行在本地 WebLogic Server 实例中或与其相连的应用程序,能向远程服务器中的端点可靠地发送消息。如果发送消息时该目标不可用(由于网络问题或系统故障),则会将这些消息将保存到本地服务器实例中,目标一旦可用就会向远程端点转发这些消息。WebLogic JMS 可利用 SAF 服务使本地 JMS 消息生成器能向远程 JMS 队列或主题可靠地发送消息,而WebLogic Web Service 可以靠 SAF 服务支持 Web Service 可靠消息传递(Web Services Reliable Messaging,WSRM)的可靠性。

  消息存储转发过程涉及的两端是:本地发送端和远程接收端点。SAF 代理负责在这些本地发送端点和远程接收端点之间存储和转发消息。可将 SAF 代理配置为仅有发送功能或接收功能,或兼具这两种功能。如果消息必须持久,则发送代理会将消息存储在持久性存储中,向接收端转发消息,然后在确认未及时返回时重新传输消息。接收代理可以检测和清除发送代理发送的重复消息,并向最终目标传递消息。对于 JMS 消息,只要发送端中有发送代理就可以进行 JMS SAF。下图是一个JMS SAF的应用场景示例。

  

  

  而Weblogic Server 9.2 JMS SAF 客户端功能将在 WebLogic Server 9.0 中引入的 JMS 存储转发服务扩展为独立 JMS 客户端。现在,即使在 JMS 客户端无法到达目标时(例如,由于网络连接暂时失败),该客户端也能够可靠地将消息发送到服务器端 JMS 目标。与服务器断开连接后,JMS SAF 客户端发送的消息会以本地方式存储在客户端文件系统中,并在该客户端重新连接时转发到服务器端 JMS 目标。 JMS SAF 客户端功能包括两个主要部分:将消息直接写入本地文件系统中的客户端持久性存储的 JMS SAF 客户端实现,以及获取写入存储的消息并将其发送到 WebLogic Server 实例的 SAF 转发器。下图是一个JMS SAF客户端功能的应用场景示例。

  

  

  二、将 JMS 客户端配置为使用客户端 SAF

  对服务器端来说无需任何配置,但是运行客户端 SAF 则需要对每个客户端进行一些配置。这些部分描述如何将 JMS 客户端配置为使用客户端 SAF。

  1、生成JMS SAF 客户端配置文件

  每台客户端计算机都需要 JMS SAF 客户端配置文件,该文件指定有关运行 JMS SAF 客户端环境所需的服务器端连接工厂和目标的信息。使用与 WebLogic 的安装捆绑的 ClientSAFGenerate 实用工具,从指定的 JMS 模块的配置文件生成 JMS SAF 客户端配置文件。

  ClientSAFGenerate 实用工具将为在源 JMS 配置文件中找到的所有连接工厂、独立目标和分布式目标创建条目,如从 JMS 模块生成 JMS SAF 客户端配置文件的步骤中所述。生成的文件将定义连接工厂和导入目标,JMS SAF 客户端将通过修改JMS 客户端应用程序以使用 JMS SAF 客户端的初始 JNDI 提供程序中所述的初始 JNDI 上下文,直接与它们进行交互。然而,生成的文件将不包括服务器端 JMS 模块中任何外部 JMS 目标或 SAF 目标的条目。此外,仅其 SAF 导出策略设置为 All 的 JMS 目标会添加到文件(目标的默认设置)。

  2、为远程 JMS SAF 上下文加密密码

  生成的 SAF 配置文件不包含任何为其生成的 SAF 远程上下文加密后的密码,不论是否已在源 JMS 模块文件中配置了任何密码。如果为在 JMS SAF 客户端配置文件中定义的远程群集或服务器上下文,配置了安全凭据,则必须将加密后的密码连接到远程服务器或群集。

  要为远程 SAF 上下文创建加密后的密码,必须使用随 WebLogic 安装捆绑的 ClientSAFEncrypt 实用工具,该实用工具加密了与 JMS SAF 客户端功能配合使用的纯文本字符串。

  3、客户端计算机上安装 JMS SAF 客户端 JAR 文件

  如何安装 JMS SAF 客户端取决于客户端计算机是否需要更小的 JAR 文件(瘦客户端),或它们是否能够适应使用单个的性能更高的 weblogic.jar 文件,该文件不仅包括所有必需的功能,而且是推荐的最佳实践。

  必需的 WebLogic JAR 文件位于 WebLogic Server 安装目录的 WL_HOME\server\lib 子目录,其中 WL_HOME 是整个 WebLogic 产品安装的顶级安装目录(例如,c:\bea\weblogic92\server\lib)。

  瘦客户端需要更小的 JAR 时,JMS SAF 客户端将需要将以下 JAR 文件安装到客户端计算机的文件系统中的某个目录中,并添加到其 CLASSPATH:

  wlsafclient.jar

  wljmsclient.jar

  wlclient.jar

  wljmsclient.jar 可以引用 wlclient.jar,因此仅需要在客户端计算机的 CLASSPATH 中放置一个或另一个 JAR。

  4、修改 JMS 客户端应用程序以使用 JMS SAF 客户端的初始 JNDI 提供程序

  JMS SAF 客户端需要特定的初始 JNDI 提供程序,以查找从 JMS 模块生成 JMS SAF 客户端配置文件的步骤期间生成的,JMS SAF 客户端配置文件中指定的服务器端 JMS 连接工厂和目标。

  修改JMS 客户端应用程序,以使用 JMS SAF 客户端 JNDI 上下文工厂来代替标准服务器初始上下文。用于 JMS SAF 客户端 JNDI 属性 java.naming.factory.initial 的名称为 weblogic.jms.safclient.jndi.InitialContextFactoryImpl。

  示例 JNDI 初始上下文工厂在 JMS SAF 客户端应用程序中应该显示为如下:

  public final static String JNDI_FACTORY="weblogic.jms.safclient.jndi.InitialContextFactoryImpl";

  通过使用标准 JNDI 查找,JMS SAF 客户端会自动启动并查找配置文件中指定的服务器端 JMS 连接工厂和目标。对于配置文件,ClientSAF.xml 是 JMS 客户端当前工作目录所需的默认名称,但是也可以通过传递 JMS 客户端中的参数,明确指定配置文件名。

  客户端 SAF示例

  1、生成 JMS SAF 客户端配置文件

  按照上文的方法,我们生成如下ClientSAF.xml:

  

  

  

  

  weblogic.examples.jms.QueueConnectionFactory

  

  false

  

  

  

  jms.connection.traderFactory

  

  false

  

  

  

  weblogic.examples.jms.TopicConnectionFactory

  

  false

  

  

  

  

  weblogic.examples.jms.exampleQueue

  weblogic.examples.jms.exampleQueue

  

  

  jms/MULTIDATASOURCE_MDB_QUEUE

  jms/MULTIDATASOURCE_MDB_QUEUE

  

  

  weblogic.wsee.DefaultQueue

  weblogic.wsee.DefaultQueue

  

  

  weblogic.examples.jms.exampleTopic

  weblogic.examples.jms.exampleTopic

  

  

  quotes

  quotes

  

  RemoteContext0

  

  

  

  t3://localhost:7001

  

  

  

  

  2、修改 JMS 客户端应用程序以使用 JMS SAF 客户端的初始 JNDI 提供程序

  下面是本文用到的JMS SAF 客户端程序,读者可以到注意其中的JNDI_FACTORY值为"weblogic.jms.safclient.jndi.InitialContextFactoryImpl":

  

  public class ClientSAFQueueSend

  {

  // Store And Forward Client JNDI: Defines the JNDI context factory

  public final static String JNDI_FACTORY="weblogic.jms.safclient.jndi.InitialContextFactoryImpl";

  // Defines the JMS context factory.

  public final static String JMS_FACTORY="weblogic.examples.jms.QueueConnectionFactory";

  // Defines the queue.

  public final static String QUEUE="weblogic.examples.jms.exampleQueue";

  private QueueConnectionFactory qconFactory;

  private QueueConnection qcon;

  private QueueSession qsession;

  private QueueSender qsender;

  private Queue queue;

  private TextMessage msg;

  

  public void init(Context ctx, String queueName)

  throws NamingException, JMSException

  {

  qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);

  qcon = qconFactory.createQueueConnection();

  qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

  queue = (Queue) ctx.lookup(queueName);

  qsender = qsession.createSender(queue);

  msg = qsession.createTextMessage();

  qcon.start();

  }

  

  public void send(String message) throws JMSException {

  msg.setText(message);

  qsender.send(msg);

  }

  

  public void close() throws JMSException {

  qsender.close();

  qsession.close();

  qcon.close();

  }

  public static void main(String[] args) throws Exception

  {

  String safFile = null;

  

  //we don't need a ClientSAF file, since ClientSAF.xml in the current working directory is implied by default

  if (args.length != 1) {

  System.out.println("Usage: java examples.jms.queue.ClientSAFQueueSend [ClientSAF.xml]");

  }

  //if an explicit client saf config file is supplied, pass it along when getting the initial context

  if( args.length >0 )

  safFile = args[0];

  

  InitialContext ic = getInitialContext(safFile);

  ClientSAFQueueSend qs = new ClientSAFQueueSend();

  qs.init(ic, QUEUE);

  readAndSend(qs);

  qs.close();

  }

  private static void readAndSend(ClientSAFQueueSend qs)

  throws IOException, JMSException

  {

  BufferedReader msgStream = new BufferedReader(new InputStreamReader(System.in));

  String line=null;

  boolean quitNow = false;

  do {

  System.out.print("Enter message (\"quit\" to quit): \n");

  line = msgStream.readLine();

  quitNow = ("quit").equalsIgnoreCase(line);

  

  if (line != null &&line.trim().length() != 0 &&!quitNow) {

  qs.send(line);

  System.out.println("JMS Message Sent: "+line+"\n");

  }

  } while (! quitNow);

  }

  private static InitialContext getInitialContext(String safFile)

  throws NamingException

  {

  Hashtable env = new Hashtable();

  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);

  if( safFile != null &&safFile.length() >0 )

  env.put(Context.PROVIDER_URL, safFile);

  return new InitialContext(env);

  }

  }

  

  3、运行示例程序,察看结果

  (1)到%weblogic_home%\weblogic92\samples\domains\wl_server下面启动WebLogic Server 9.2自带的Example Domain。这里需要注意的是,我们默认SAF客户端和Weblogic Server运行在同一台机子上,如果读者在做实验的时候需要运行在不同的服务器上,请通过修改ClientSAF.xml中的saf-remote-context来进行配置。

  (2)在Workshop中导入本文附件中代的项目工程,并且以Java Application方式运行其中的ClientSAFQueueSend.java.如下图所示:

  

  

  (3)通过Weblogic Server Admin Console察看接受到的消息。位置在“JMS Modules -> examples-jms -> exampleQueue -> Monitoring -> show messages”

  

  

  至此,我们简单的介绍了Weblogic Server 9.2中的JMS SAF 客户端功能以及其使用情况,并且通过一个示例进行了说明和演示。如果有读者想进一步了解这个方面有的相关信息,可以查看如下连接:

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章