部署Weblogic的jms的问题

06-03-26 dongle
配置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.>

jdon_sun
2006-03-27 15:04
log已经说的很清楚了

xuechen0721
2006-04-06 20:42
这个问题我以前我也遇到过,也困惑了我很久。

这是因为你的MDB被默认的处在一个容器事务中,而消息队列却没有被加入到这个容器事务中,所以你的MDB捕捉不到消息队列。

我的解决的方法是,在MDB的配置文件中的事务属性去掉。就一切OK了!

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

请高手们指点。

一点建议,大家讨论!

banq
2006-04-10 12:07
楼主问题可能是消息的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后,它可以重新读取消息。

xuechen0721
2006-04-27 12:59
从banq的叙述中又学到了不少啊!

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

我又看了一下我的代码,(我用的是P-P队列方式)发现:

一、在messageSend代码中,我已使用commit()进行了事务提交。

二、messge发送后,我在weblogic的管理控制台中就能看见我所发送的消息(传送的字节数和消息的数量值增加了)

如上所述,是不是应该能够证明我的消息发送已经成功,已经commit()了?

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

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

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

猜你喜欢