我们有一个Openshift项目(project1),其中我们使用图像amq- amq-broker-7-tech-preview / amq-broker-71-openshif设置了一个AMQ Artemis经纪人。作为基本映像,我们没有任何配置,例如SSL或TLS。为了进行设置,我们以示例为例:https://github.com/jboss-container-images/jboss-amq-7-broker-openshift-image/blob/amq71-dev/templates/amq-broker-71-basic.yaml
在Openshift上部署映像后,我们将获得以下内容:
在Java中,我们尝试从另一个Openshift服务尝试连接到代理,但收到以下错误:
[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
答案 0 :(得分:1)
在没有为相关服务定义路由的情况下,似乎您正在尝试使用OpenShift路由连接到代理。您(或安装程序)为Jolokia定义了一条路线,但经纪人没有路线。
您在这里不会收到有用的错误消息,因为以正确域结尾的任何主机名将连接到OpenShift路由器。但是,路由器将不知道如何在没有有效路由的情况下处理连接,并且可能只会向JMS客户端返回某种毫无意义的错误包。
如果您尝试从与代理相同的OpenShift命名空间中的另一个应用程序连接到代理,则无需通过路由器进行连接-只需使用服务名称(大概为broker-amq-tcp
)和服务端口在您的JMS设置中明确显示。
如果要从同一集群中不同OpenShift命名空间中的另一个应用程序连接到代理,则可以配置网络子系统以允许跨命名空间直接连接到服务。不幸的是,这是在安装OpenShift之后进行的一些简单设置。
如果要从OpenShift命名空间外部连接到代理,并且不能直接使用服务,则必须通过路由进行连接,并且必须使用加密连接。但这不一定出于安全考虑-路由器将从SSL标头中读取SNI信息,以确定如何路由请求。
因此,您需要为代理的SSL端口创建服务,为该服务创建路由,从代理中导出服务器证书,将这些证书导入客户端,并配置客户端以通过以下方式使用SSL连接URI:路由器。显然,如果可以的话,直接使用服务会更容易;)
所有这些设置步骤在Red Hat的OpenShift AMQ7文档中进行了描述:
尽管我不能否认在该文档中有大量的信息可以通过。