群集WildFly 10域消息
我有三台机器位于不同的网络:群集WildFly 10域消息
- 作为主
- 作为节点-1
- 作为节点-2
在如-master我将WildFly作为域主机主机,两个节点将WildFly作为域主机 - 从机,每个都在全功能服务器组中启动一个实例。在as-master Web控制台中,我可以看到full-ha配置文件运行时中的两个节点,如果我部署WAR,它将在两个节点上正确启动。
现在,我试图实现的是两个WAR实例之间的消息传递,即从as-node-1中的生产者实例发送消息,所有节点中的消费者都应该接收消息。
这是我的尝试:添加了一个话题WildFly domain.xml
:
<jms-topic name="MyTopic" entries="java:/jms/my-topic"/>
创建JAX-RS端点触发绑定到该话题生产者:
@Path("jms")
@RequestScoped
public class MessageEndpoint {
@Inject
JMSContext context;
@Resource(mappedName = "java:/jms/my-topic")
Topic myTopic;
@GET
public void sendMessage() {
this.context.createProducer().send(this.myTopic, "Hello!");
}
}
创建一个MDB监听到主题:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(
propertyName = "destination",
propertyValue = "java:/jms/my-topic"
),
@ActivationConfigProperty(
propertyName = "destinationType",
propertyValue = "javax.jms.Topic")
)
)
public class MyMessageListener implements MessageListener {
private final static Logger LOGGER = /* ... */
public void onMessage(Message message) {
try {
String body = message.getBody(String.class)
LOGGER.info("Received message: " + body);
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
}
但是当我curl as-node-1/jms
我看到日志o只有as-node-1,而当我curl as-node-2/jms
我只看到as-node-2的日志。
不应该在部署WAR的所有节点上传递消息吗?我错过了什么?
因为我提出了完全相同的问题 - 在这里提出答案。
是的,如果目的地是主题,则应将消息传递到所有节点。
在默认配置下的ActiveMQ阿蒂米斯使用广播查找并连接到其他节点上的其他ActiveMQ的情况下(同样发现组内):
<discovery-group name="dg-group1" jgroups-channel="activemq-cluster"/>
<cluster-connection name="my-cluster" discovery-group="dg-group1" connector-name="http-connector" address="jms"/>
仍需要确保为JMS JNDI名称与“JMS” -topic开始在上面的线匹配address="jms"
(什么是你的情况确定:“java:/jms/my-topic
”)
在你的榜样错过的唯一的事情得到它的所有节点上的工作是:<cluster password="yourPassword" user="activemqUser"/>
(肯定activemqUser
用户必须先加入,例如,与addUser.sh脚本)。
这让ActiveMQ实例相互通信。所谓的核心桥接器在节点之间创建连接。如ActiveMQ manual中所述:
..这个用户是透明的幕后 - 你不必 宣布一个明确的桥梁,为每个节点
如果一切正常,则可以大桥在server.log中找到:AMQ221027: Bridge [email protected] [name=sf.my-cluster ...] is connected.
顺便说一句,如果目的地是队列那么ActiveMQ将不会向其他节点发送消息,除非消息未被本地消费。
P.s.如回答here,这指的是将事件分发到群集中的所有节点的经典方法。