作为一个非科班出身的程序员,一直不大敢写技术类东西,怕没有深度贻笑大方。最近在坛子里面看到一篇
关于利用oracle侦听线程连发送消息
通知处理来实现松耦合的文章,觉得将自己用的产品心得写出来也还不错,可以练练手,同时也让自己受益,毕竟不能让自己太闲了。
其实上面那篇文章是一个典型的触发器的应用,触发器用处非常广,不管是所谓的基于事件的JSF,或者是Swing的listener,都处都是它的影子,基本所有成熟的商业产品都会加入这么一个特性,对于开发中的作用也是挺大的,我下面谈下我开发中用到的MQ简单侦听器应用。
前年开发的一个银行系统,某银行和人行之间的通信是通过MQ报文进行交互的,而应用服务器的选型是weblogic8.1(太古老了),当时的MQ版本是MQ6.0。这是一个典型的基于消息的应该,就是要求消息一来就要进行相应的处理,当然如果是JMS队列的话,基本上就很简单了,毕竟MDB能够监听它,但是这里是MQ,MQ和WebSphere结合的很好,他可以让MDB监听MQ队列和监听JMS队列一样简单,可以直接配置JMS队列对应MQ队列,但是到了weblogic就不行了,
weblogic的JMS队列和MQ是完全没有关系的,也就是说weblogic根本不知道MQ什么时候得到消息,服务器就不能实时的处理业务(该死的厂商不兼容…)。
(基于这个情况我后来查了一些资料,发现BEA和IBM也给出过解决方案,比较复杂,要配置一堆东西。而且和厂商绑定也是很紧,出错了也不知道找谁,我还是倾向我自己的这个方案,这是后话)。
当时有两个选择:
1.轮询MQ对列,有消息就取出来(听着就不大好)
2.
“想办法让weblogic服务器知道MQ收到消息”
我们倾向第二种,毕竟由消息来通知比较靠谱,而且轮询比较浪费浪费资源,而且能够实时的得到消息,这时我们就注意到MQ的触发器了:
如图:
这是一个
本地队列的属性选项,它有一个
触发器选型,我们可以将它打开,我们可以看到它的
触发器类型,具体表示:
第一个(FIRST):当收到第一个消息的时候触发该触发器
每个(EVERY):每收到一个消息都触发
深度(DEPTH):可以配置指定深度的消息时候触发该触发器
触发器被触发的时候会做些什么呢?我们看看还有一个
进程名称的输入框(记住我们这里配置为
Trigger),也就是说
触发器被触发时候会执行该名称的进程
(关于该进程我们在后面会说到)。
脚本如下:
define QLOCAL(QUEUE1)
put(enable) get(enable)
Trigger //表示开通触发器
PROCESS(Trigger) //触发进程
TRIGTYPE(FIRST) //触发器类型为first
USAGE(NORMAL)
INITQ('SYSTEM.DEFAULT.INITIATION.QUEUE') //初始化队列
REPLACE[/size]
上面我们提到,我们
要想办法让服务器知道MQ收到消息了,利用触发器,我们可以很好的做到这点(当然没有直接配置为JMS队列方便了),方案如下:
首先我们在weblogic配置了一个MDB,让他来监听并且处理MQ队列的消息,这是我们的初衷,前面我们说过weblogic的MDB不能监听MQ,所以利用触发来达到这一点,我们假定监听的连接工厂JNDI为jms/connection,JMS队列为queue,首先我们写一个往MDB侦听的JMS队列发送消息的简单程序:
import java.util.Hashtable;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
public class Trigger {
public static void main(String[] args) {
QueueConnection conn = null;
try {
Hashtable hash = new Hashtable();
hash.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
hash.put(Context.PROVIDER_URL,"t3://localhost:7001");
InitialContext ic = new InitialContext(hash);
QueueConnectionFactory factory = (QueueConnectionFactory) ic.lookup("jms/connection");
conn = factory.createQueueConnection();
QueueSession session = conn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) ic.lookup("queue");
QueueSender sender = session.createSender(queue);
TextMessage message = session.createTextMessage("Trigger");
sender.send(message);
} catch (Exception e) {
System.out.println(e.getStackTrace());
} finally {
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
System.out.println(e.getStackTrace());
}
}
}
}
}
然后我们在服务器上上面编译该java文件 javac Trigger.java,生成 .class文件,然后将该类的路径配置进环境变量。这样我们得到一个发生JMS消息的程序。
记得我们前面提到过
进程定义,这也是MQ的一个特征,如图:
我们可以在
队列管理器的高级-----进程定义------------新建进程定义Trigger,我们可以看到一个
应用程序标识框,可以输入命令,即标识该经常定义所做的事情,这里我们定义为java Trigger,即给weblogic的MDB监听的JMS队列发送消息,即该进程定义为支持java Trigger命令。
脚本:
define process(Trigger) appltype(unix) applicid(java Trigger)
这样,我们的配置就结束了,具体的处理流程是这样的:
MQ本地队列收到消息-------》触发触发器----------》执行进程定义--------》java Trigger给MDB的JMS对列发送消息-------》weblogic的MDB收到消息,然后去MQ读取报文,这样就实现了MDB能够知道MQ什么时候收到消息,然后针对进行业务处理了。
这样就实现了weblogic8.1的MDB可以监听MQ队列了,当然了,针对触发器大家还可以做出各种应用,就看具体的需求了。
(不知道9或者以后的版本weblogic能不能直接监听MQ队列)
这样也会产生其他的问题,
比如MDB的事务就很难保证,还有出了异常的MQ消息的容错处理,毕竟不是JMS对列,J2EE的事务好像加不上去。
对于触发器(又或者叫侦听器,都是侦听事件然后做出相应的处理),在很多产品都应用,比如DB2的触发器,又或者是WPS流程人工任务的事件处理(这里就不详谈),这也很像我们平时所谈到的pull和push得选择一样,既然很多成熟的产品都选择了这样特性,也说明了它的可取之处,也是push用的比pull多的原因,也许我们在平时开发的过程中加上一点触发器的思想,可能会收到不错的效果。
写的比较乱,如果有错误欢迎大家指出。希望对需要的人有所帮助。
PS:写完不知道往哪里发,以前的厂商分坛找不到了,只能放这里了。。。。
- 大小: 21.2 KB
- 大小: 30.9 KB
分享到:
相关推荐
weblogic 8.1 plugin for Eclipse 3.4 weblogic 8.1 plugin for Eclipse 3.4 weblogic 8.1 plugin for Eclipse 3.4
WebLogic Server 8.1是Oracle公司开发的一款企业级应用服务器,它在Java平台上提供了一个用于构建、部署和管理分布式应用程序的平台。WebLogic Server 8.1的安装过程是IT管理员和开发者需要掌握的关键技能之一,因为...
本文将深入探讨如何在MyEclipse 6.0环境下配置WebLogic 8.1,确保两者能够无缝协作,从而实现高效、稳定的Java EE应用开发。 ### 一、理解MyEclipse与WebLogic的关系 MyEclipse是一款基于Eclipse的插件集合,它为...
通过上述步骤,可以成功地在 Weblogic 8.1 上配置和部署应用程序。这些步骤不仅包括了基本的配置流程,还涉及到了一些常见的问题解决方法,对于初次接触 Weblogic 8.1 的用户来说是非常有用的指导。
5. **安全管理**:WebLogic Server 8.1提供了基于角色的访问控制(RBAC)、SSL/TLS加密、JAAS(Java Authentication and Authorization Service)集成等功能,以保护应用程序和数据的安全。 6. **性能监控与管理**...
weblogic8.1版本_1 BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、 网络应用和数据库应用的Java应用服务器。 这个版本很难找哦......
### Weblogic 8.1 应用部署详细指南 #### 一、概述 在IT行业中,Weblogic作为一款成熟的企业级应用服务器,在企业级Java应用的部署与管理方面发挥着重要作用。本文档将详细介绍如何在Weblogic 8.1环境下进行应用...
### WebLogic 8.1 的安装与配置详细指南 #### 一、WebLogic 8.1 安装步骤详解 **1.1 开始安装** - **欢迎界面**:启动安装程序后,首先会遇到一个欢迎界面,确认无误后点击【Next】。 - **许可协议**:“License...
WebLogic Server 8.1 是 BEA Systems 提供的一款中间件产品,用于构建、部署和管理企业级Java应用。在本文中,我们将详细探讨如何安装和配置WebLogic 8.1。 1. **软件获取与版权** 软件版权是开发人员应尊重的重要...
在本文中,我们将深入探讨如何配置WebLogic 8.1,包括设置WebLogic Workshop IDE的字体、安装简体中文包、调整系统语言环境以及理解WebLogic Workshop 8.1在处理SOAP消息时的编码行为。 首先,我们来关注WebLogic ...
WebLogic Server 8.1是Oracle公司开发的一款企业级Java应用服务器,它是基于Java EE(Java Platform, Enterprise Edition)标准的,为构建、部署和管理分布式应用程序提供了全面的平台。这款服务器版本在2002年发布...
WebLogic Server 8.1是Oracle公司开发的一款企业级Java应用服务器,它是基于Java EE(Java Platform, Enterprise Edition)标准的,主要用于构建、部署和管理分布式应用程序。在本篇文章中,我们将深入探讨WebLogic ...
AIX下运行的weblogic8,weblogic8.1sp5补丁,修复该版本服务无故停止响应的问题
### WebLogic 8.1 配置说明 #### 前言 WebLogic Server 是一款高性能、高可用性且易于管理的应用服务器,适用于构建大型企业级应用系统。本篇文章将根据给定的部分内容来详细解释如何进行 WebLogic 8.1 的安装与...
weblogic8.1版本_7 BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、 网络应用和数据库应用的Java应用服务器。 这个版本很难找哦......
WebLogic Server 是一款功能强大的企业级 Java 应用服务器,它提供了高性能、高可用性和易于管理的功能,支持 Java EE 规范。对于初学者来说,理解和配置 WebLogic 可能会有些困难。本文档将详细介绍 WebLogic 8.1 ...
WebLogic Server 8.1 是一款由 BEA Systems(后来被甲骨文公司收购)开发的企业级应用服务器,主要用于部署和管理Java EE应用程序。在本文中,我们将详细讲解WebLogic Server 8.1的安装与配置步骤,这对于初学者了解...
WebLogic Server 8.1 是一个历史悠久的企业级Java应用程序服务器,由甲骨文公司开发,用于托管基于Java的Web应用程序和服务。在这个配置部署文档中,我们将深入探讨如何在WebLogic 8.1环境中配置JNDI(Java Naming ...
在WebLogic 8.1中配置JDBC是一个关键步骤,因为JDBC(Java Database Connectivity)是Java应用程序与各种数据库之间通信的标准接口。本教程将详细解释如何在WebLogic服务器上设置JDBC连接池和数据源。 首先,启动...
Weblogic 8.1 +SP2破解版