发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA
1 2 3 4 下一页 Go 4

MDB做Facade的几个疑惑

         
2005-03-23 17:07
赞助商链接

用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>
我觉得这样还不够,不知道还有没有什么其他的方法

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

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

2005-03-23 23:32

怎么没人帮帮忙?

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

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

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

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

2005-03-24 10:45

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

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

2005-03-24 11:03

谢谢banq的回复

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

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

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

请banq指教,谢谢!!!

2005-03-24 17:47

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

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

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

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

4Go 1 2 3 4 下一页

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com