MDB做Facade的几个疑惑

用MDB和SLSB组合来做facade的好处这里就没必要说了,但是现在在具体用MDB来做facade的时候就碰到一些问题:

1、客户端只能针对某个Queue和Topic和发送Message,而MDB在onMessage()调用具体的逻辑代码。客户端基本上是针对一个用例发送一个Message,所以要么就是几个用例发送到一个Queue或者Topic,然后在MDB里做判断再调用具体逻辑代码。这样子MDB里就充斥了一堆 if.... else if....,日后维护起来也很郁闷;
要么就是针对用例建立不同的Queue或者Topic,然后客户端选择不同的目的进行发送Message,但是这样就会有一堆的Queue和Topic,而且还有相应的MDB,数量恐怕不会少,恐怕到多的时候连自己都会糊涂了。

不知道针对这个问题大家是怎么解决的。

2、在EJB CookBook里有提到:
When a transaction in a message-driven bean rolls back, the application server
can be configured to resend the JMS message that started the transaction. If the
error that caused the rollback keeps occurring, you could potentially cause an
endless loop.

他的解决办法是:
private HashMap previousMessages;
private int count = 0;
public void onMessage( Message incomingMsg )
{
// get the unique message Id
String msgId = incomingMsg.getJMSMessageID();
if ( previousMessages.containsKey(msgId) )
count = ( (Integer) msgMap.get(msgId) ).intValue();
else
count = 0;
// if msg has been retried couple of times, discard it.
// and remove the stored id.
if ( count < _MAX_REDLIVERY_CONST_ )
{
logMessage(incomingMsg);
previousMessages.remove( msgId );
return;
}
//perform business logic for message
boolean error = doBusinessFunction();
if ( error )
{
mdbContext.setRollBackOnly();
previousMessages.put( msgId, new Integer(++count) );
}
else
{
if( previousMessages.containsKey( msgId ) )
previousMessages.remove( msgId );
}
}
我认为这么做是不是只能对对Queue只有一个MDB接收实例的时候能起作用,也就是所pool不能多于一个,书上也有提到可以用服务器特定的描述符设定来实现,不知道weblogic是怎么设定的,我没找到
^^!!!

3、怎么防止未授权的用户发送Message或者说是过滤相应的Message
我知道对于后者可以设定:
<message-selector>
<![CDATA[ UserRole = 'BuyerRole' ]]>
</message-selector>
我觉得这样还不够,不知道还有没有什么其他的方法

请各位大虾出手,解答小弟心中的疑惑,谢谢!!

不知道还有没有其他的解决方案或者类似的东西可以参考,希望大家多多帮忙

怎么没人帮帮忙?

现在如果直接用sun的jms1.1做起来总感觉有点力不从心,实现的功能满足不了要求(可能是我要求的太多了),在这方面是不是要借助一些jms的第三方开源的东西,类似joram(支持jms1.1)或者openjms(支持jms1.02),如果用了这些东西,是不是不好和应用服务器(weblogic)一起协调运作,比如joram好像就有自己的相当于server的东西(不知道我理解对不对),那么weblogic现有的jms的服务都不能用了(好像有点浪费),还有容器管理事务,EJB调用....

不知道哪位做过类似的东西,请指个方向

还请问有没有其他的解决方案(异步方式)

请banq和各位高手解惑,谢谢!!

如果希望JMS+事务 ,就要使用EJB的MDB。

是分多个管道,还是在一个管道里进行判断,取决于你的业务设计,一般情况是建设多个管道比较好,管道个数多也没关系,反正在一个XML里配置啊,我们也没有嫌弃ejb-jar.xml中的ejb个数多啊。

谢谢banq的回复

我自己认为JMS的客户端和MDB端做的事情都差不多:
JMS客户端:选择Message的种类和发送管道不同,其他大同小异
MDB:都是根据情况调用其他的逻辑方法,并对客户端回复

但是我总觉得很难从中抽象出一些东西来,就是很多东西都类似,但是又想不到办法重用(除了取ConnectioFactory可以放在ServicesLocator里),以后加入新的东西又是code类似的代码。

我是想做成一个比较通用的东西,以后只要子类简单的实现一些东西就可以了,不知道我想的是不是太天真了

请banq指教,谢谢!!!

这里还有一个问题,就是说客户端发送的Message是怎么填充的,MDB就要把相应的东西解析出来(而且是通过硬编码实现的)。那么我想是不是能把Message做成一个自我解释的东西呢,MDB只要拿到这个Message就知道他该怎么解析内部的数据,并作为参数调用相应的类的方法(反射机制?),还知道处理结果的Message该怎么构建,往哪发送。

如果做成这样,Message换成XML,似乎有点像web Services的做法了。

不知道这样做实不实际,我主要是想做出一个比较通用的东西来,当然效率也不能太低。

不知道这个问题有没有其他的解决办法,当然前提的考虑异步,weblogic服务器的容器管理事务(EntityBean),有没有好的第三方的东西来实现(最好是开源的),谢谢大家!!!!谢谢banq

关于第一个问题的解决方法:
Message都是由body的,这个Body承载了整个消息的内容

那么我们可以这样做:
在这个Message的特定字段强制定义为控制信息。
比如,我把message的前5位作为消息的不同类型
AAAAA290329032823
AAAAB23823823
那么AAAAAA 和AAAAB就代表了这个消息不是一回事,
具体是什么要看你的定义了。
然后解析该消息就行---------要配置消息的格式。

你的第三个问题属于权限管理
在权限管理上加上限制就行了

谢谢楼上的回复

看来得先仔细看看weblogic对Jms的支持

另外我还想问对于message的回复,也就是MDB处理完后回复客户端一般怎么做才会比较安全(这里的安全是指回复不会丢失和别没有权限的客户接收)和效率高

谢谢!!

好久没来看这个帖子了,有点冷清

现在正选用一个open source的MOM - xmlBlaster来夹在Client和weblogic的中间,提供更加强大的消息支持

问题是发现这方面的资料奇缺(除了它自己提供的一些demo和requirements文档),现在对怎么使用它来和weblogic配合使用,事物控制,消息反馈(client->MOM->MDB(weblogic)->MOM->client)

不知道哪位有过使用xmlBlaster或者其他MOM的经验来给大家分享一下~~~

我用过IBM的MQ,算可以说上一点话。

建议第二条,为每一个用例建立一个Topic或者Queue。

我们即将完成的项目是建立企业消息总线的,大项目,也是这样做的,基本上每个应用接入消息总线,在总线内部的MQ里面都要为该应用建立一个队列,两个通道(发送方和接收方)。

呵呵,不要嫌麻烦,我们总线里面MQ队列管理器里面已经有好几百个队列了。

请问楼上的老兄是否有这方面的资料

方便的情况下能否共享以下

mail: popufig@yeah.net

多谢!!

原本引入MOM的初衷是想借助MOM的强大功能

我的实际应用是像销售订单这样重要数据的最后对数据库的新增,删除,修改。由于项目是采取C/S的模式,不想让用户在一次更新后等待太久,所以采用异步的方式。

但是出现现在问题蛮多:

1、(XmlBlaster is a publish/subscribe and point to point 100% Java based MOM server (message-oriented middleware) which exchanges messages between publishers and subscribers. The message is described with XML-encoded meta information. Messages may contain everything, GIF images, Java objects, Python scripts, XML data, a word document, plain text - just anything. )上面的话是出自xmlBlaster的主站,由于它的消息是用xml来进行描述的,那么在客户端和服务器端对xml的处理都需要花费时间,这样是不是有点得不偿失?

2、xmlBlaster这方面的资料很少,特别是怎么才能和weblogic配合起来使用,这方面我们没有取得什么进展。

3、单纯的采用在客户端发送JMS到Topic or Queue,然后MDB从其中的两者去接收,然后处理,这种做法能不能满足复杂的应用,维护的代价会不会很大,还有老问题就是事务的控制和对客户端消息的反馈(复杂的消息反馈:比如一个订单存储失败则把数据要送回客户端),而且不能考虑临时队列这样容易造成消息丢失不安全的做法

4、是否采用异步方式处理像订单数据存储这样的动作本身就有一定的问题。(因为项目以后应用的区域跨度范围会很大,比如从深圳到广州,是用VPN,响应时间是个头痛的问题)

5、是否有其他的解决办法,比如说选用其他的个MOM,但是前提是开源的。

请banq和各位有经验的大虾指教,谢谢!!

您能不能举个详细的例子?比如那步使用异步操作?该步的详细过程。

看了你例子再说话吧。

谢谢您的答复:

比如说要处理一个订单:
工作人员先把数据敲进界面,我们很多的情况都是主从表在一个界面上,所以一笔单的数据就包括主表的一条记录和从表的多条记录,完成后,用户触发保存动作,然后在客户端将数据一起打包成JMS消息交给weblogic上的MDB来处理(就是这里的异步),不排除在中间加入MOM提供更加强大的消息支持。然后MDB处理这些数据(有可能包括一定的业务逻辑,最后是存入数据库,整个是一个事务),如果失败,事务会滚,且要将数据返回给用户,用户可以在界面上重现这笔资料。成功的话就没必要返回消息。

现在我担心的是单纯用JMS+MDB会造成客户端和服务器端都很难维护,比如说怎么划分Topic和queue就是一大问题(好像MOM有一种像路由一样的功能,一般情况下这样我们就可以改了服务器端的Topic和Queue后只用配置MOM)。还有并发性的控制,安全性...

请楼上的老兄给点意见,谢谢!!!!

现在我们又在考量另一个openSource的东西:ActiveMQ目前还不清楚怎么和weblogic配置在一起使用,但是用起来没底啊

怕到时候一堆问题会被晕死的

哪位有这方面的经验的,出来把经验分享一下啊