初识EJB3.0的MDB来开发JMS

来源:互联网 发布:删除多重网络 编辑:程序博客网 时间:2024/04/30 08:08

第一次接触和使用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@d5f9b9[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:/jboss4.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.csdn.net/wangke8476/archive/2007/09/08/1776877.aspx

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

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