Java 需要澄清JMS与activemqbean/资源配置的区别吗
在如何使用JMS资源以及在Java 需要澄清JMS与activemqbean/资源配置的区别吗,java,glassfish,jms,activemq,ejb-3.1,Java,Glassfish,Jms,Activemq,Ejb 3.1,在如何使用JMS资源以及在@MessageDriven批注上使用适当的@ActivationConfigProperty设置activationConfig时,似乎存在一些不一致 首先,这里是我的资源配置(glassfish resources.xml,但可转换为其他部署描述符)。这适用于Glassfish(asadmin add resources Glassfish resources.xml)以及: 当定义@MessageDrivenbean时,就会出现混淆。使用mappedName的以下
@MessageDriven
批注上使用适当的@ActivationConfigProperty
设置activationConfig
时,似乎存在一些不一致
首先,这里是我的资源配置(glassfish resources.xml,但可转换为其他部署描述符)。这适用于Glassfish(asadmin add resources Glassfish resources.xml)以及:
当定义@MessageDrivenbean时,就会出现混淆。使用mappedName的以下命令引发异常:
@MessageDriven(mappedName = "jms/queue/myApp")
public class MessageBean implements MessageListener
警告:RAR8000:类中不存在方法setName:
org.apache.activemq.command.ActiveMQQueue警告:RAR7097:否
类中的属性名称存在setter方法
org.apache.activemq.command.activemq队列信息:访问未访问
参考资料信息:访问未访问的参考资料警告:RAR8501:
ra[activemq rar]的端点激活期间发生异常,
activationSpecClass[org.apache.activemq.ra.ActiveMQActivationSpec]
:javax.resource.ResourceException:未知目标类型:null
严重:MDB00017:[InvoiceProductionMessageBean]:中出现异常
正在创建消息驱动bean容器:[java.lang.Exception]严重:
java.lang.Exception
我被迫将我的MDB定义为:
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName = "connectionFactoryLookup", propertyValue = "jms/factory/myApp"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "myAppAMQ"),
@ActivationConfigProperty(propertyName = "messageSelector", propertyValue = " JMSType = 'TypeA' "),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
}
)
public class MessageBean implements MessageListener
我需要提供一个glassfish ejb jar.xml告诉容器使用ActiveMQ资源,否则我会得到一个java.lang.ClassCastException
:
警告:RAR8501:ra端点激活期间发生异常[
jmsra],activationSpecClass[com.sun.messaging.jms.ra.ActivationSpec
]:java.lang.ClassCastException:
无法将org.apache.activemq.ra.ActiveMQConnectionFactory强制转换为
com.sun.messaging.jms.ra.DirectConnectionFactory严重:MDB00017:
[MessageBean]:创建消息驱动程序时出现异常
bean容器:[java.lang.Exception]严重:java.lang.Exception
glassfish ejb jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd">
<glassfish-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>MessageBean</ejb-name>
<mdb-resource-adapter>
<resource-adapter-mid>activemq-rar</resource-adapter-mid>
</mdb-resource-adapter>
</ejb>
</enterprise-beans>
</glassfish-ejb-jar>
MessageBean
activemq rar
因此,生产者如何使用资源(JNDI)和消费者如何使用资源(XML+@ActivationConfigProperty
)之间似乎存在一些不一致之处。此外,EE7 ActivationConfigProperty属性似乎不起作用。例如,使用destinationLookup不会查找目标,我被迫使用ActiveMQ的destination
属性
ActiveMQ:
acknowledgeMode(要使用的JMS确认模式。有效值
是:自动确认或Dups ok确认)
clientId(要使用的JMS客户端ID(仅在持久的
(主题)
目的地类型(目的地类型;队列或主题)
目的地(目的地名称(队列或主题名称))
启用批处理(用于启用事务批处理以增加
(表演)
maxMessagesPerBatch(每个事务批处理的消息数)
maxMessagesPerSessions(这实际上是
订阅。(是的,名称不正确。)
maxSessions(要使用的最大并发会话数)
消息选择器(用于订阅的JMS消息选择器
执行基于内容的路由(对邮件进行筛选)
noLocal(仅主题订阅需要;指示是否在本地
已发布的邮件是否应包含在订阅中)
密码(JMS连接的密码)
订阅耐久性(无论是否为持久(主题)订阅
是必需的。有效值为:持久或不持久)
subscriptionName(持久订户的名称。仅用于
持久主题,并与clientID相结合,以唯一标识
持久主题订阅)
用户名(JMS连接的用户)
useRAManagedTransaction(通常,资源适配器提供
发送到由容器管理的端点的消息。通常,
此容器希望成为要控制
用于传递入站邮件的事务。但是
有时,您希望交付到一个更简单的容器系统,该系统将
无法控制入站事务。在这些情况下,如果
如果useRAManagedTransaction为true,则资源适配器将提交
如果MessageListener未生成异常,则执行事务,并且
如果引发异常,请回滚。)
初始重新交付显示(重新交付开始前的延迟。另外
可在ResourceAdapter上配置)
最大重新交付次数(重新交付的最大次数或-1表示否
最大值。也可在ResourceAdapter上配置)
重新交付回退乘数(返回时使用的乘数
关闭已启用。也可在ResourceAdapter上配置)
重新交付参见指数退避(启用指数退避。另外
可在ResourceAdapter上配置useJndi否false为true时,使用
目标(作为jndi名称)
Java EE7规范:
acknowledgeMode(此属性用于指定JMS
bean管理时消息传递的确认模式
使用事务划分。其值为自动确认或
Dups_ok_确认。如果未指定此属性,则JMS
假设自动确认语义
消息选择器(Thi
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName = "connectionFactoryLookup", propertyValue = "jms/factory/myApp"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "myAppAMQ"),
@ActivationConfigProperty(propertyName = "messageSelector", propertyValue = " JMSType = 'TypeA' "),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
}
)
public class MessageBean implements MessageListener
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd">
<glassfish-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>MessageBean</ejb-name>
<mdb-resource-adapter>
<resource-adapter-mid>activemq-rar</resource-adapter-mid>
</mdb-resource-adapter>
</ejb>
</enterprise-beans>
</glassfish-ejb-jar>