8.5. 连接到服务器


如果要将客户端连接到服务器,您必须有一个正确的连接器。有两种方法可以做到这一点。您可以使用服务器上配置的 ConnectionFactory,可通过 JNDI 查找获取。或者,也可以使用 ActiveMQ Artemis 核心 API,并在客户端上配置整个 ConnectionFactory

8.5.1. Jakarta Messaging Connection Factories

客户端可以使用 JNDI 来查找提供服务器连接的 ConnectionFactory 对象。连接事实可以公开三种连接器类型中的每种类型:

远程客户端可以使用 引用 remote-connector 的连接事实来向服务器发送消息或从服务器接收消息(假设 connection-factory 具有适当的导出的条目)。远程连接器与 socket-binding 关联,该 绑定使用 connection-factory 在哪里连接来告知客户端。

引用 in- vm-connector 的连接事实适合供本地客户端用于向本地服务器发送消息或接收消息。in-vm-connectorserver-id 关联,后者使用 connection-factory 进行连接的位置告知客户端,因为多个消息传递服务器可以在单个 JVM 中运行。

在升级到消息传递协议之前,引用 http-connector 的连接 事实适合供远程客户端用于通过连接到服务器的 HTTP 端口来发送消息或从服务器接收消息。http-connector 与代表 HTTP 套接字的 socket-binding 关联,默认为 http

自 Jakarta Messaging 2.0 起,默认的 Jakarta Messaging 连接工厂可供 JNDI 名称 java:comp/DefaultJMSConnectionFactory 下的 Jakarta EE 应用访问。messaging-activemq 子系统定义一个 pooled-connection-factory,用于提供此默认连接工厂。

以下是 JBoss EAP 完整 配置配置文件中所含的默认连接器和连接工厂:

<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
  <server name="default">
    [...]
    <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"/>
    [...]
    <connection-factory name="InVmConnectionFactory" connectors="in-vm" entries="java:/ConnectionFactory" />
    <pooled-connection-factory name="activemq-ra" transaction="xa" connectors="in-vm" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory"/>
    [...]
    </server>
</subsystem>
Copy to Clipboard Toggle word wrap

工厂的 entries 属性指定将工厂公开的 JNDI 名称。只有 java:jboss/exported 命名空间内绑定的 JNDI 名称可用于远程客户端。如果 connection-factoryjava:jboss/exported 命名空间中绑定了条目,远程客户端将在 java:jboss/exported 之后使用文本查找 connection-factory。例如,RemoteConnectionFactory 默认绑定到 java:jboss/exported/jms/RemoteConnectionFactory,这意味着远程客户端将使用 jms/RemoteConnectionFactory 来查找此连接事实。pooled-connection-factory 应当不会在 java:jboss/exported 命名空间内绑定任何条目,因为 pooled-connection-factory 不适合于远程客户端。

8.5.2. 使用 JNDI 连接到服务器

如果客户端驻留在与服务器相同的 JVM 中,它可以使用 InVmConnectionFactory 提供的 in-vm 连接器。以下是如何配置 InvmConnectionFactory,如 standalone-full.xml 中找到。

<connection-factory
  name="InVmConnectionFactory"
  entries="java:/ConnectionFactory"
  connectors="in-vm" />
Copy to Clipboard Toggle word wrap

注意 entries 属性的值。使用 InVmConnectionFactory 的客户端应在查找过程中丢弃前导 java:/,如下例所示:

InitialContext ctx = new InitialContext();
ConnectionFactory cf = (ConnectionFactory)ctx.lookup("ConnectionFactory");
Connection connection = cf.createConnection();
Copy to Clipboard Toggle word wrap

远程客户端使用 RemoteConnectionFactory,它通常配置如下:

<connection-factory
  name="RemoteConnectionFactory"
  scheduled-thread-pool-max-size="10"
  entries="java:jboss/exported/jms/RemoteConnectionFactory"
  connectors="http-connector"/>
Copy to Clipboard Toggle word wrap

远程客户端应忽略 条目 值的前导 java:jboss/exported/,如下代码片段示例:

final Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
env.put(Context.PROVIDER_URL, "http-remoting://remotehost:8080");
InitialContext remotingCtx = new InitialContext(env);
ConnectionFactory cf = (ConnectionFactory) remotingCtx.lookup("jms/RemoteConnectionFactory");
Copy to Clipboard Toggle word wrap

注意 PROVIDER_URL 属性的值,以及客户端如何使用 JBoss EAP http-remoing 协议。另请注意客户端如何使用 org.wildfly.naming.client.WildFlyInitialContextFactory,这意味着客户端拥有此类及其包含的客户端 JAR 在类路径中的某处。对于 maven 项目,这可以通过包含以下依赖项来实现:

<dependencies>
  <dependency>
    <groupId>org.wildfly</groupId>
    <artifactId>wildfly-jms-client-bom</artifactId>
    <type>pom</type>
  </dependency>
</dependencies>
Copy to Clipboard Toggle word wrap

8.5.3. 使用 Core API 连接到服务器

您可以使用 Core API 进行客户端连接,而无需 JNDI 查找。使用核心 API 的客户端在其类路径中要求客户端 JAR,就像基于 JNDI 的客户端一样。

ServerLocator

客户端使用 ServerLocator 实例来创建 ClientSessionFactory 实例。顾名思义,ServerLocator 实例用于查找服务器并创建与服务器的连接。

在 Jakarta Messaging 术语中,对 ServerLocator 的思考方式与 Jakarta Messaging Connection Factory 相同。

ServerLocator 实例是使用 ActiveMQClient 工厂类创建的。

ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.class.getName()));
Copy to Clipboard Toggle word wrap
ClientSessionFactory

客户端使用 ClientSessionFactory 创建 客户端Session 实例,这些实例基本上是与服务器的连接。在 Jakarta Messaging 术语中,它们被视为 Jakarta Messaging 连接。

ClientSessionFactory 实例使用 ServerLocator 类创建。

ClientSessionFactory factory =  locator.createClientSessionFactory();
Copy to Clipboard Toggle word wrap
ClientSession

客户端使用客户端 Session 来使用和生成消息,并将其分组到交易中。ClientSession 实例可以同时支持事务和非事务性语义,还提供 XAResource 接口,使得消息传递操作可以作为 Jakarta Transactions 操作的一部分来执行。

ClientSession Instance group ClientConsumersClientProducers.

ClientSession session = factory.createSession();
Copy to Clipboard Toggle word wrap

以下简单示例重点介绍了刚刚讨论的一些内容:

ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(
  new TransportConfiguration( InVMConnectorFactory.class.getName()));

// In this simple example, we just use one session for both
// producing and consuming
ClientSessionFactory factory =  locator.createClientSessionFactory();
ClientSession session = factory.createSession();

// A producer is associated with an address ...
ClientProducer producer = session.createProducer("example");
ClientMessage message = session.createMessage(true);
message.getBodyBuffer().writeString("Hello");

// We need a queue attached to the address ...
session.createQueue("example", "example", true);

// And a consumer attached to the queue ...
ClientConsumer consumer = session.createConsumer("example");

// Once we have a queue, we can send the message ...
producer.send(message);

// We need to start the session before we can -receive- messages ...
session.start();
ClientMessage msgReceived = consumer.receive();

System.out.println("message = " + msgReceived.getBodyBuffer().readString());

session.close();
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat