初识EJB3.0的MDB来开发JMS

本文介绍了初学者如何在EJB3.0环境中使用MDB开发JMS。通过实例展示了创建MDB的过程,以及针对Queue和Topic类型的配置区别。在遇到destination配置问题时,通过修改jbossmq-service.XML文件和设置jndiName来解决。最后,展示了JMS消息的Header和Body属性,并提供了相关参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次接触和使用EJB3.0的MDB来开发JMS,写下一点心得

第一步在已有的EJB3.0下创建一个MDB,在创建的时候可以看到,首先每一个MDB都实现了MessageListener接口;其次,需要选择采用的是queue还是topic类型的消息。

根据消息类型的不同,产生的注释会有不同,需要具体情况进行配置。

采用Queue类型的时候,会产生如下的注释:

@MessageDriven(mappedName = "jms/B", activationConfig = {

        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),

        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") })

 

 

采用topic类型的时候,会产生如下的注释:

@MessageDriven(mappedName = "jms/A", activationConfig = {

        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),

        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),

        @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),

        @ActivationConfigProperty(propertyName = "clientId", propertyValue = "A"),

        @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "A") })

 

很显然,采用topic域的时候需要配置的东西比较多,事实上topic也是较queue要复杂一些的。

 

由于以后系统要用到topic域,我仅仅开发的是一个示例程序,所以就只是简单的配置。@MessageDriven(mappedName = "jms/NewMessageConsumer",

        activationConfig = {

        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),

        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),

        @ActivationConfigProperty(propertyName = "destination"   ,   propertyValue = "topic/newTopic/myTopic")

}

)

 

虽然是短短几行,但是对于初学的我来讲还是费了不少周折。

NewMessageConsumermdb文件的名称,@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),

        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),

这两行一般由系统生成之后如果没有变化就可以不用修改。然而,自动生成的程序里面缺少了@ActivationConfigProperty(propertyName = "destination"   ,   propertyValue = "topic/newTopic/myTopic")这一行。如果没有这一行jboss会出现org.jboss.deployment.DeploymentException: Required config property RequiredConfigPropertyMetaData@d 5f 9b9[name=destination descriptions=[DescriptionMetaData@1102fab[language=zh]]] for messagingType 'javax.jms.MessageListener' not found in activation config [ActivationConfigProperty(acknowledgeMode=Auto-acknowledge), ActivationConfigProperty(destinationType=javax.jms.Topic)] ra=jboss.jca:service=RARDeployment,name='jms-ra.rar'

最初以为是MessageListener的配置出现了问题,加了一行 messageListenerInterface=javax.jms.MessageListener.class,但是问题依然还在,

上网找了一圈之后发现是destination 没有设置,在D:/jboss 4.2.2 /server/default/deploy/jms下找到jbossmq-service.XML文件添加了新的Topic

加上了@ActivationConfigProperty(propertyName = "destination"   ,   propertyValue = "topic/newTopic ") 但是问题依然存在。后来发现原来jndiName没有进行设置,建立了新的topic但是没有创建新的jndi,于是修改刚刚配置过的文档,添加了一行:

修改了程序中的注释:@ActivationConfigProperty(propertyName = "destination"   ,   propertyValue = "topic/newTopic/myTopic") ,这样就可以了。

 

Jboss中的详细信息:

 

运行client程序,会发现在jboss中会出现一条消息的完整格式:

Header {

   jmsDestination  : TOPIC.newTopic

   jmsDeliveryMode : 2

   jmsExpiration   : 0

   jmsPriority     : 4

   jmsMessageID    : ID:3-12058913534061

   jmsTimeStamp    : 1205891353406

   jmsCorrelationID: null

   jmsReplyTo      : null

   jmsType         : null

   jmsRedelivered  : true

   jmsProperties   : {JMS_JBOSS_REDELIVERY_COUNT=3}

   jmsPropReadWrite: false

   msgReadOnly     : true

   producerClientId: ID:3

}

Body {

   text            :succcess!

}

这些属性其实可以在annotation中进行设置

 

 

参考:

http://blog.youkuaiyun.com/wangke8476/archive/2007/09/08/1776877.aspx

http://www.80diy.com/home/20050413/16/3933445.html

http://topic.youkuaiyun.com/u/20080118/15/87678e07-8aec-47d1-9499-698bbfef0b3d.html

 

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值