请高手指点关于JMS问题

最近,准备完成这样的一个项目:

用JMS实现两个应用之间的数据传递。我们提取A应用的有效信息,把数据用XML封装,通过JMS Server暂存,由B应用去取出XML格式的消息然后使用。

现在请教大家这个问题的解决办法,基于WAS5。

我没有想明白的问题是:

1.A应用通过什么样的渠道把消息发送出去?自己写一个JSP页面?然后怎么去取所谓的有用的数据?还是做个客户端,可是这可能需要一个J2EE客户端啊!仍然需要部署啊!

2.我是想用消息驱动Bean来实现消息的接收的,但是问题是,消息驱动Bean对消息的处理是在自己的onMessage()方法里的。怎么进一步的把数据转发到相应的应用上去?即B应用如何从消息驱动Bean里面拿出这个消息?

我不是高手。

不过,我对这个问题有自己的看法。
请各位斧正。

A、B两个应用之间传递XML数据:
提取A应用的有效信息,把数据用XML封装
通过JMS Server暂存
由B应用去取出XML格式

我认为这个问题需要以下几个步骤:
0.用户发送操作
1。A应用准备数据
2。发送程序 把A应用数据打包并发送到一个Queue或Topic,
Durable异步方式
3。过一段时间
4。接受程序 到Queue/TOPIC 中取数据(并销毁 根据需要),去掉XML,还原信息,在Onmessage方法内,调用B对象的入口

通过什么渠道把A数据发出,
可以根据用户的一个操作
比如提交表单,
然后激发步骤1
或者任何其他用户操作都行



首先感谢楼上的回复
数据的发送很好实现,关键是接收!
接收端,倘若用消息驱动Bean的话,在OnMessage方法中处理完,调用B的对象,可是怎么样把控制权交给B呢?毕竟是B来完成数据的提取和使用。
这种推的方式好像主动权不好交给B。

如果不用消息驱动Bean的话,我今天测试接收端用servlet来调用接收程序实现,(因为是发布订阅模式,所以只能用推的方式)结果呢,报了一个很奇怪的错误:
javax.jms.IllegalStateException: Method setMessageListener not permitted
难道是因为发送和接收都是servlet的原因?

我想了解一下B应用的情况

是应用程序还是WEB应用?

B应用现在是否已经完成?
并且不允许修改或者增加新的代码?

B应用也是Web应用,B应用可能不止一个,所以如果从消息驱动Bean里面直接去调用B的话,可能需求变化很大。因为可能有很多B,我采用发布订阅模式,所有的B都是预订者。
B应用当然可以添加代码了
所以,我就不明白了,感觉上这是个拉的关系!
谢谢。

MDB不就是B的对象吗?MDB处理数据不就是B获得了主动权了吗?

说的好。
一开始我是不想把消息驱动Bean写到B应用里面。
但是现在我这么想的:
B里面用消息驱动Bean来接收消息,然后再调用实体Bean把数据写到数据库
,最后B里面的页面可以通过数据库显示数据。
请大家指点,感觉上这个项目没有这么大,难道非要用EJB不成吗?我对
EJB不熟,怕用不好,造成效率低下啊!

ai...

数据是封装在消息里的

不一定用实体bean,你可以用Hibernate,也可以直接用JDBC。
MDB很好用的,比另外两种Bean都简单很多,就是事物方面有些难,不过也没有关系。

有点象MessageFacade模式^_^

楼上的意思是:直接在onMessage()方法中使用JDBC写数据库吗?
这样的话,是不是不太符合将具体的业务分离出来的原则?
请指点啊!
你认为onMessage()拿到消息后,怎么写入数据库?如果不用Hibernate(主要是不会用),能不能给个小为详细点的指点。谢谢!

即便不用Entity Bean或Hibernate,也应该设计持久层,就是负责执行数据库操作的一些类。onMessage调用持久层的类实现业务逻辑。建议找一本EJB设计模式或J2EE核心模式,参考一下。
Hibernate在比较简单的数据库结构和简单的事物的情况下,非常好用,强烈推荐。学习起来也不难。如果复杂的话,写映射配置文件会很烦人--没有好的IDE环境丫。

>能不能给个小为详细点的指点
不敢当。书上是这样写的:
MDB和SessionBean实现业务逻辑--老外叫它们“服务层”
EntityBean,Hibernate和Jdbc DAO(data access object)操作数据库--“持久层”

服务层通过调用持久层实现业务。
把数据表及其关系映射为类(值类),负责层与层之间的数据传递。

这就是很常用层次结构。
结合你的应用:MDB接收JMS中的消息,并且转换为值类,作为参数传递给持久层的方法(都是onMessage中执行),然后由持久层的类将数据写入数据库。
如果是EntiyBean、Local接口,就不需要值类,而直接create。
如果是Hibernate,建立一个session,save一下就行了。
如果是Jdbc dao,那么就传递值类。

多谢楼上的回复,有机会请你吃饭

为什么不问我呢

这个问题我做过,是的要用到实体Bean。我的QQ:27222328.