我正在尝试将一些数据发送到Wildfly 10 Artemis实例,并使用Apache Camel接收它们。
在这里,我知道可以使用camel-jms组件来完成。

在这种情况下,我首先创建了一个简单的示例来检查它是否工作正常。
但是它在ConnectionFactory创建点给出了以下异常。

Exception in thread "main" javax.naming.NamingException: Failed to connect to any server. Servers tried: [http-remoting://localhost:8080]
    at org.jboss.naming.remote.client.HaRemoteNamingStore.failOverSequence(HaRemoteNamingStore.java:213)
    at org.jboss.naming.remote.client.HaRemoteNamingStore.namingStore(HaRemoteNamingStore.java:144)
    at org.jboss.naming.remote.client.HaRemoteNamingStore.namingOperation(HaRemoteNamingStore.java:125)
    at org.jboss.naming.remote.client.HaRemoteNamingStore.lookup(HaRemoteNamingStore.java:241)
    at org.jboss.naming.remote.client.RemoteContext.lookup(RemoteContext.java:79)
    at org.jboss.naming.remote.client.RemoteContext.lookup(RemoteContext.java:83)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)


实施方式:

Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
props.put(Context.PROVIDER_URL, WILDFLY_REMOTING_URL);
props.put(Context.SECURITY_PRINCIPAL, JMS_USERNAME);
props.put(Context.SECURITY_CREDENTIALS, JMS_PASSWORD);

InitialContext context = new InitialContext(props);
ConnectionFactory connectionFactory =  (QueueConnectionFactory) context.lookup(JMS_CONNECTION_FACTORY_JNDI);
System.out.println("connectionFactory : " + connectionFactory);

SimpleRouteBuilder routeBuilder = new SimpleRouteBuilder();
CamelContext ctx = new DefaultCamelContext();
ctx.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));

ctx.addRoutes(routeBuilder);
ctx.start();
Thread.sleep(5 * 60 * 1000);
ctx.stop();


常数:

public final static String JMS_CONNECTION_FACTORY_JNDI="jms/RemoteConnectionFactory";
public final static String JMS_QUEUE_JNDI="jms/queue/TestQ";
public final static String JMS_USERNAME="jmsuser";       //  The role for this user is "guest" in ApplicationRealm
public final static String JMS_PASSWORD="jmsuser@123";
public final static String WILDFLY_REMOTING_URL="http-remoting://localhost:8080";


进口:

import java.util.Properties;
import javax.jms.ConnectionFactory;
import org.apache.camel.CamelContext;
import org.apache.camel.component.jms.JmsComponent;
import org.apache.camel.impl.DefaultCamelContext;
import javax.jms.QueueConnectionFactory;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;


但是,当我使用here中提到的纯javax.jms(而不是通过Camel)时,这会成功发生。当我直接向活动mq发送消息(而不是向Wildfly Artemis发送消息)时,它成功运行。

SimpleRouteBuilder routeBuilder = new SimpleRouteBuilder();
CamelContext ctx = new DefaultCamelContext();

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://0.0.0.0:61616");
ctx.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));

ctx.addRoutes(routeBuilder);
ctx.start();
Thread.sleep(5 * 60 * 1000);
ctx.stop();


我想知道的是使用Apache Camel将数据发送到Wildfly嵌入的Artemis insnatnce并将其接收回来。
有人可以给这个小提示吗?

最佳答案

您收到的错误是:

Failed to connect to any server. Servers tried: [http-remoting://localhost:8080]


这向我表明,您的Wildfly实例实际上并未在localhost:8080上侦听JNDI连接。您尚未包含任何Wildfly配置或日志记录,因此这只是一个猜测。

您还说过,“当我直接向活动的mq发送消息(而不是向Wildfly Artemis发送消息)时,它可以成功工作,”但尚不清楚这实际上意味着什么。 Apache ActiveMQ Artemis是ActiveMQ代理(顾名思义),因此当您说向“活动mq”发送消息时,不清楚是指独立的Artemis(即未嵌入Wildfly)还是ActiveMQ 5.x代理。

最后,将Artemis称为“ Wildfly Artemis”可能会产生误导,因为Artemis不是Wildfly项目,而是Apache项目。我认为“ Wildfly Artemis”实际上是“嵌入Wildfly的ActiveMQ Artemis”。

10-01 20:26