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-connector
与 server-id
关联,后者使用 connection-factory
进行连接的位置告知客户端,因为多个消息传递服务器可以在单个 JVM 中运行。
在升级到消息传递协议之前,引用
事实适合供远程客户端用于通过连接到服务器的 HTTP 端口来发送消息或从服务器接收消息。http-connector
的连接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 完整
配置配置文件中所含的默认连接器和连接工厂:
工厂的 entries
属性指定将工厂公开的 JNDI 名称。只有 java:jboss/exported
命名空间内绑定的 JNDI 名称可用于远程客户端。如果 connection-factory
在 java: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" />
<connection-factory
name="InVmConnectionFactory"
entries="java:/ConnectionFactory"
connectors="in-vm" />
注意 entries
属性的值。使用 InVmConnectionFactory
的客户端应在查找过程中丢弃前导 java:/
,如下例所示:
InitialContext ctx = new InitialContext(); ConnectionFactory cf = (ConnectionFactory)ctx.lookup("ConnectionFactory"); Connection connection = cf.createConnection();
InitialContext ctx = new InitialContext();
ConnectionFactory cf = (ConnectionFactory)ctx.lookup("ConnectionFactory");
Connection connection = cf.createConnection();
远程客户端使用 RemoteConnectionFactory
,它通常配置如下:
<connection-factory name="RemoteConnectionFactory" scheduled-thread-pool-max-size="10" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
<connection-factory
name="RemoteConnectionFactory"
scheduled-thread-pool-max-size="10"
entries="java:jboss/exported/jms/RemoteConnectionFactory"
connectors="http-connector"/>
远程客户端应忽略 条目
值的前导 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");
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");
注意 PROVIDER_URL
属性的值,以及客户端如何使用 JBoss EAP http-remoing 协议。另请注意客户端如何使用 org.wildfly.naming.client.WildFlyInitialContextFactory
,这意味着客户端拥有此类及其包含的客户端 JAR 在类路径中的某处。对于 maven 项目,这可以通过包含以下依赖项来实现:
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()));
ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.class.getName()));
ClientSessionFactory
客户端使用 ClientSessionFactory
创建 客户端Session
实例,这些实例基本上是与服务器的连接。在 Jakarta Messaging 术语中,它们被视为 Jakarta Messaging 连接。
ClientSessionFactory
实例使用 ServerLocator
类创建。
ClientSessionFactory factory = locator.createClientSessionFactory();
ClientSessionFactory factory = locator.createClientSessionFactory();
ClientSession
客户端使用客户端 Session
来使用和生成消息,并将其分组到交易中。ClientSession
实例可以同时支持事务和非事务性语义,还提供 XAResource 接口,使得消息传递操作可以作为 Jakarta Transactions 操作的一部分来执行。
ClientSession
Instance group ClientConsumers
和 ClientProducers
.
ClientSession session = factory.createSession();
ClientSession session = factory.createSession();
以下简单示例重点介绍了刚刚讨论的一些内容: