Jakarta ee JavaEE-带有JMS和MDB的消息传递系统

Jakarta ee JavaEE-带有JMS和MDB的消息传递系统,jakarta-ee,ejb,jms,message-driven-bean,Jakarta Ee,Ejb,Jms,Message Driven Bean,我是JavaEE的新手,我尝试使用jms和mdb构建消息传递系统。我想做以下工作: -由mdb实现的用于处理消息的服务器 -应该沟通的不同客户 -客户端应该只通过服务器进行通信,而不是直接进行通信 所以没什么特别的。我在oracle的文档和教程中读了很多,我仍然对一些事情感到困惑(尽管它正在工作) 1.消息驱动bean: 在@MessageDriven注释中,可以使用@ActivationConfigProperty注释配置bean,例如: @MessageDriven(mappedName =

我是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;
这是正确的还是有更好的解决方案

我知道这是非常基本的,但我感到困惑,因为例如,教程形式与我没有得到的教程有一些不同


我有点困惑,所以任何澄清都会很好

您所指的队列存在于您的应用程序之外,由您的服务器提供访问它们的机制。最简单的情况是,您的队列由服务器定义,使所有在那里运行的应用程序都可以轻松地使用它们。实际定义是特定于提供商的(即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> 
这定义了
clientQueue
队列,该队列应满足通过
@Resource(name=“clientQueue”)
进行的查找

请注意,您的MDB还需要额外的配置来指定从哪个队列侦听消息

@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/clientQueue")
我建议您从服务器供应商提供的一个简单示例开始。这里有一些很好的例子和例子。
快乐黑客

@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/clientQueue")