部署Weblogic的jms的问题

配置Weblogic
启动WebLogic7
打开IE6,在地址栏中输入:<http://localhost:7001/console>
输入用户名和密码
在左边的目录树中选中Services->JMS->Connection
Factories,单击右侧的Configure a new JMS Connection Factory,输入以下信息:
Configuration->General页:
Name=MDBDemo Connection Factory
JNDIName=MDBDemoCF
其它不变,单击Create建立Connection Factory。
Targets->Server页:
将myserver(服务器名称)移至右侧的列表中,但击单击Apply
在左边的目录树中选中Services->JMS->Stores,单击右侧的Configure a new JMSFileStore,输入以下信息:
Configuration->General页:
Name=MDBDemo Store
Directory:=F:\bea\user_projects\mydomain\JMSStores
单击Create建立JMSFileStore。
Services->JMS->Servers,单击右侧的Configure a new JMS Connection Factory,输入以下信息:
Configuration->General页:
Name=MDBDemo JMSServer
Store=MDBDemo Store
其它不变,单击Create建立JMSServer。
Targets->Servers页:
Target=myserver(你的weblogic server的名字)
单击Configuration->General页中的Configure Destinations
Name=MDBDemo Topic
JNDIName=MDBDemo Topic
其它不变,单击Create建立Destination。
配置完毕。
建立Message Driven Bean:
1.关闭所有工程:File->Close Projects
2.选择File->Newproject
3.在Name栏中输入MDBDemo,Directory栏中输入存放路径(不要有空格),其他不变,单击Finish。
4.选择File->New->Enterprise->EJB Module单击OK。
5.在弹出的对话框中,在Name中输入MDBMoudle,Version选择:EJB2.0 Compliant其余不变,单击OK关闭当前对话框。
6.在右侧的EJB Designer 中单击鼠标右键选择:Create EJB->Message-Driven Bean,按如下填写:
Bean Name=MDBDemo
Transaction Type=Container
Destination Name=MDBDemo Topic
Destination Type=javax.jms.Topic
其它不变。
7.Project->Make”MDBModule”,编译成功后,右键单击左上角的MDBModule选择Deploy,将其发布至Weblogic。

按照上面的步骤,配置jms,再在JBuilder2005里建立Message Driven Bean,部署到Weblogic,结果出现下面的错误,那位大虾帮忙看看,感激不尽。
我使用的是Weblogic8.1 sp4 中文版。
<2006-3-25 下午08时56分00秒 CST> <Warning> <EJB> <BEA-010061> <The Message-Drive
n EJB: MDBDemo is unable to connect to the JMS destination: MDBDemo Topic. The Er
ror was:
[EJB:011010]The JMS destination with the JNDI name: MDBDemo Topic could not be fo
und. Please ensure that the JNDI name in the weblogic-ejb-jar.xml is correct, an
d the JMS destination has been deployed.>

log已经说的很清楚了

这个问题我以前我也遇到过,也困惑了我很久。
这是因为你的MDB被默认的处在一个容器事务中,而消息队列却没有被加入到这个容器事务中,所以你的MDB捕捉不到消息队列。
我的解决的方法是,在MDB的配置文件中的事务属性去掉。就一切OK了!

但是现在我都没搞明白,怎样把消息队列也加到MDB所属的事务中,毕竟这样会更好。
请高手们指点。

一点建议,大家讨论!

楼主问题可能是消息的JNDI没有被发现,可能是JNDI没有配置,或没有了解Weblogic的JNDI使用方法。

>你的问题:把消息队列也加到MDB所属的事务
这是可以的,取决于你的队列是Queue还是Topic,然后使用duration等配置来实现。

关键了解JMS的不同事务实现原理:
1.消息发送的事务机制:发送者发送消息到目的地,如果这一过程是包含在一个事务中,那么接受者只有等待到这个事务结束commit后才能读取到消息。当这个事务roll back,消息将从目的地删除。
2.消息读取的事务机制:

Point to point:当在一个事务中读取消息时,这个消息在这个事务中可用,但是并未从目的地中删除,而是留在目的地只是不会被其它接受者看到。当事务commit后,消息才完全从目的地删除。
如果事务roll back, 消息将还是留在目的地,这样就可以被另外一个事务读取。这称为replay。通过配置可以决定一个消息被几次重新递交给接受者。什么时候停止递交等。

Publish和subscriber:如果读取事务roll back,消息将被丢弃。
如果一个订阅者在durable模式,消息系统将为其保存消息,订阅者事务roll back后,它可以重新读取消息。


从banq的叙述中又学到了不少啊!
但对于我提出的问题,听了banq的讲解我还是不明白。我对事务的理解可以说一知半解,特别是在实际运用中更没有这个经验。

我又看了一下我的代码,(我用的是P-P队列方式)发现:
一、在messageSend代码中,我已使用commit()进行了事务提交。
二、messge发送后,我在weblogic的管理控制台中就能看见我所发送的消息(传送的字节数和消息的数量值增加了)
如上所述,是不是应该能够证明我的消息发送已经成功,已经commit()了?

但我所建的MDB(它是异步的)默认的有一个事务属性(后来出现那个问题后我把它去掉了),在它侦听队列时,还有事务的概念存在嘛?(MDB本身在一个事务中,而它所侦听的队列还有事务的概念?)如果存在事务的概念,那队列又怎么加入到其中呢?就是在MDB事务存在的情况下怎么侦听到队列中的消息

对于楼主的问题产生原因,banq大哥,我和你的意见不太一致。因为我曾经出现过同样的问题,困扰了我很久,无意中有所领悟后更改了MDB的事务属性,立即就能侦听到队列中的内容了。

又是很多问题啊!希望banq和各位高手多多指点!