第一次接触和使用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")
}
)
虽然是短短几行,但是对于初学的我来讲还是费了不少周折。
NewMessageConsumer是mdb文件的名称,@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