我是JavaEE的新手,我尝试使用jms和mdb构建一个消息传递系统。我想做以下事情: - 用于处理由mdb实现的消息的服务器 - 应该沟通的不同客户 - 客户应该只通过服务器而不是直接进行通信
所以没什么特别的。我已经在oracle的文档和教程中阅读了很多内容,但我仍然对某些事情感到困惑(尽管它有效)。
1.消息驱动的bean: 在@MessageDriven注释中,可以使用@ActivationConfigProperty注释配置bean,例如:
@MessageDriven(mappedName = "myBean", activationConfig = {
@ActivationConfigProperty(propertyName = "messageSelector",
propertyValue = "requestType = 'reqA' OR requestType = 'reqB'"),
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue")})
但我如何"创造"这个bean的队列?我想在这里想点什么..
2.对于我使用托管bean的客户端。客户端能够发送和接收,因此他们需要队列或主题。我使用
在客户端中创建队列@Resource(name = "clientQueue")
private Queue clientQueue;
并使用
从mdb获取队列@Resource(mappedName = "serverBean")
private Queue serverQueue;
在mdb中,我使用
从客户端获取队列 @Resource(name = "clientQueue")
private Queue clientQueue;
这是正确的还是有更好的解决方案?
我知道这是非常基本但我很困惑,例如教程表单apache tomcat与oracle中的教程有一些不同之处。
我有点困惑,所以任何澄清都会非常好!
答案 0 :(得分:0)
您指的队列存在于您的应用程序之外,您的服务器需要提供访问它们的机制。最简单的方案是您的队列由您的服务器定义,使其可以轻松地在那里运行的所有应用程序使用。实际定义是提供者特定的(即jboss,payara等不同)。
让我们看一下如何在Wildfly / JBoss上完成它。服务器使用ActiveMQ消息子系统,我们可以在其中定义连接工厂,队列,主题等。
<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">
<server name="default">
<security-setting name="#">
<role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/>
</security-setting>
<address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/>
<http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/>
<http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput">
<param name="batch-delay" value="50"/>
</http-connector>
<in-vm-connector name="in-vm" server-id="0"/>
<http-acceptor name="http-acceptor" http-listener="default"/>
<http-acceptor name="http-acceptor-throughput" http-listener="default">
<param name="batch-delay" value="50"/>
<param name="direct-deliver" value="false"/>
</http-acceptor>
<in-vm-acceptor name="in-vm" server-id="0"/>
<jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
<jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
<connection-factory name="InVmConnectionFactory" connectors="in-vm" entries="java:/ConnectionFactory"/>
<connection-factory name="RemoteConnectionFactory" connectors="http-connector" entries="java:jboss/exported/jms/RemoteConnectionFactory"/>
<pooled-connection-factory name="activemq-ra" transaction="xa" connectors="in-vm" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory"/>
</server>
</subsystem>
这是Wildfly 10上的默认配置(您必须使用完整配置文件,或手动将messaging-activemq
子系统添加到您的配置文件中)。默认配置已提供本地连接工厂(InVmConnectionFactory
)和两个队列 - 死信队列和到期队列。让我们为你添加新的队列:
每个队列都需要有一个名称和至少一个jndi查找条目。
<jms-queue name="ClientQueue" entries="java:/jms/queue/clientQueue"/>
这定义了clientQueue
队列,它应该通过@Resource(name = "clientQueue")
来满足您的查询。
请注意,您的MDB还需要其他配置来指定从哪个队列侦听消息。
@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/clientQueue")