2017-08-10 5 views
1

j'ai trois machines situées dans différents réseaux:Clustered wildfly 10 messagerie domaine

  • comme maître
  • as-node-1
  • comme nœud-2

En tant que -master J'ai WildFly en tant que maître d'hôte de domaine et les deux nœuds ont WildFly en tant qu'hôte-serveur de domaine démarrant chacun une instance dans le groupe de serveurs full-ha. À partir de la console Web as-master, je peux voir les deux nœuds dans l'exécution du profil full-ha et si je déploie un WAR, il démarre correctement sur les deux nœuds. Maintenant, ce que j'essaye de réaliser est la messagerie entre les deux instances du WAR, c'est-à-dire envoyer un message d'une instance de producteur dans as-node-1, les consommateurs dans tous les nœuds devraient recevoir le message.

C'est ce que j'ai essayé: ajouté un sujet à wildfly domain.xml:

<jms-topic name="MyTopic" entries="java:/jms/my-topic"/> 

Créer un point de terminaison JAX-RS pour déclencher un producteur lié au sujet:

@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!"); 
    } 

} 

Créer une MDB écoute au sujet:

@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); 
     } 
    } 

} 

Mais quand je vois le curl as-node-1/jms je o journal nly dans as-node-1, et quand I curl as-node-2/jms je ne vois le log que dans as-node-2.

Le message ne doit-il pas être distribué sur tous les noeuds sur lesquels le fichier WAR est déployé? Qu'est-ce que je rate?

Répondre

2

Comme je suis venu avec exactement la même question - mettez la réponse ici.

Oui, les messages doivent être envoyés à tous les nœuds si la destination est Rubrique.

Avec la configuration par défaut ActiveMQ Artemis utilise la diffusion pour découvrir et se connecter à d'autres instances de ActiveMQ sur d'autres noeuds (dans la même découverte groupe):

<discovery-group name="dg-group1" jgroups-channel="activemq-cluster"/> 
<cluster-connection name="my-cluster" discovery-group="dg-group1" connector-name="http-connector" address="jms"/> 

Encore faut-il faire en sorte que le nom JNDI pour un jms -topic commence par les « jms » pour correspondre à la address="jms" dans la ligne ci-dessus (ce qui est OK dans votre cas: « java:/jms/my-topic »)

la seule chose manquer dans votre exemple pour le faire fonctionner sur tous les nœuds est :
<cluster password="yourPassword" user="activemqUser"/>
(pour sûr activemqUser l'utilisateur doit être ajouté plus tôt, par ex. avec le script addUser.sh).

Cela permet aux instances ActiveMQ de communiquer entre elles. La connexion Core Bridge est créée entre les nœuds. Comme indiqué dans ActiveMQ manual:

..cela se fait de manière transparente dans les coulisses - vous ne devez déclarer un pont explicite pour chaque nœud

Si tout est OK alors le pont se trouve dans server.log: AMQ221027: Bridge [email protected] [name=sf.my-cluster ...] is connected.

BTW, Si une destination est une file d'attente , ActiveMQ n'enverra pas de message aux autres noeuds sauf si un message n'est pas consommé localement.

P.s. comme réponse here cela fait référence à une approche classique pour distribuer un événement à tous les nœuds d'un cluster.