【问题标题】:Connection refused when trying to connect to ActiveMQ Artemis deployed on Openshift尝试连接到 Openshift 上部署的 ActiveMQ Artemis 时连接被拒绝
【发布时间】:2020-09-22 12:45:25
【问题描述】:

我们有一个 Openshift 项目 ( project1 ),我们在其中使用图像设置了一个 AMQ Artemis 代理:amq-amq-broker-7-tech-preview/amq-broker-71-openshif。作为基本镜像,我们没有任何配置,例如 SSL 或 TLS。为了进行我们用作示例的设置:https://github.com/jboss-container-images/jboss-amq-7-broker-openshift-image/blob/amq71-dev/templates/amq-broker-71-basic.yaml

在 Openshift 上部署映像后,我们有以下内容:

从另一个 Openshift 服务,在 Java 中,我们尝试连接到代理,但我们收到以下错误:

[org.apache.activemq.transport.failover.FailoverTransport] (ActiveMQ Task-1) Failed to connect to [tcp://broker-amq-amqp-project1.192.168.99.105.nip.io:61616?keepAlive=true] after: 230 attempt(s) with Connection refused (Connection refused), continuing to retry.

Java 代码:

user = "example";
password = "example";

String address = "queue/example";

InitialContext context = new InitialContext();

queue = (Queue) context.lookup(address);
ConnectionFactory cf = (ConnectionFactory) context.lookup("ConnectionFactory");
try (Connection connection = cf.createConnection(user, password);) {
    connection.start();
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
}

JNDI 属性文件

java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=failover:(tcp://broker-amq-amqp-project1.192.168.99.105.nip.io:61616?keepAlive=true)?randomize=false
queue.queue/example=example/strings

【问题讨论】:

    标签: java openshift activemq-artemis


    【解决方案1】:

    当没有为相关服务定义路由时,您似乎正在尝试使用 OpenShift 路由连接到代理。您(或安装程序)为 Jolokia 定义了路由,但没有用于代理的路由。

    您不会在此处收到有用的错误消息,因为以正确域结尾的任何主机名都将连接到 OpenShift 路由器。但是,如果没有有效路由,路由器将不知道如何处理连接,并且可能只会向 JMS 客户端返回某种无意义的错误数据包。

    如果您尝试从与代理相同的 OpenShift 命名空间中的另一个应用程序连接到代理,则无需通过路由器连接 - 只需使用服务名称(大概是 broker-amq-tcp)和服务在您的 JMS 设置中明确端口。

    如果您要从同一集群中不同 OpenShift 命名空间中的另一个应用程序连接到代理,您可以配置网络子系统以允许跨命名空间直接连接到服务。不幸的是,在安装 OpenShift 之后设置起来有点繁琐。

    如果您从 OpenShift 命名空间外部连接到代理,并且您不能直接使用服务,则必须通过路由进行连接,并且您必须使用加密连接.这不一定是为了安全——路由器会从 SSL 标头中读取 SNI 信息来确定如何路由请求。

    因此,您需要为代理的 SSL 端口创建一个服务,为该服务创建一个路由,从代理导出服务器证书,将这些证书导入您的客户端,并将客户端配置为通过以下方式使用 SSL 连接 URI路由器。显然,如果可以的话,直接使用该服务会更容易;)

    Red Hat 的 AMQ7-on-OpenShift 文档中描述了所有这些设置步骤:

    https://access.redhat.com/documentation/en-us/red_hat_amq/7.5/html/deploying_amq_broker_on_openshift/index

    虽然我不能否认该文档中包含大量信息。

    【讨论】:

    • 或者,既然这是红帽的东西,请联系红帽技术支持。我碰巧知道所有这些人都只是坐在他们的手上无所事事。抱歉,开个玩笑;)
    • 我们正在尝试从同一个 Openshift 项目(从同一个 Openshift 项目中的另一个服务)进行连接,我认为这就是您所说的同一个工作区的意思。正如您在 jndi 属性文件中看到的那样,我们正在尝试使用服务名称进行连接,但仍然收到问题中提到的错误
    • 我认为jndi.properties 中的内容是broker-amq-amqp-project1.192.168.99.105.nip.io。这不是服务名称,而是路由主机名。试试broker-amq-amqp。而且,是的,“项目”是 OpenShift 用于其他人所称的命名空间的名称。对此感到抱歉。
    • 另外——登录到运行客户端的 pod,然后运行 ​​curl broker-amq-amqp:61616。您不会得到有意义的响应,因为代理不使用 HTTP,但您也不应该得到“无主机路由”或“连接被拒绝”。
    • 我们尝试使用java.naming.provider.url=failover:(tcp://broker-amq-amqp?keepAlive=true)?randomize=false,但现在我们收到相同的错误,但显示消息:Failed to connect to [tcp://broker-amq-amqp?keepAlive=true] after: 10 attempt(s)with port out of range:-1, continuing to retry.
    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 2012-10-19
    • 2021-11-16
    • 1970-01-01
    • 2019-10-20
    • 2021-06-27
    • 1970-01-01
    • 2020-01-29
    相关资源
    最近更新 更多