2016-03-09 1 views
4

Quelqu'un pourrait-il fournir un exemple d'application de messagerie fonctionnant sous un cluster Wildfly 10 (domaine)? Nous nous débattons avec cela et étant donné que c'est une nouvelle technologie, il y a un manque terrible de ressources.Messagerie Artemis (ActiveMQ) dans le cluster Wildfly 10 (domaine)

Actuellement, nous avons ce qui suit:

Un domaine se composant de deux ordinateurs (nœuds) et trois groupes de chaque, à savoir six serveurs distincts dans le domaine.

une partie pertinente de configuration du serveur (en domain.xml):

 <subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0"> 
      <server name="default"> 
       <security enabled="false"/> 
       <cluster password="${jboss.messaging.cluster.password}"/> 
       <security-setting name="#"> 
        <role name="guest" delete-non-durable-queue="true" create-non-durable-queue="true" consume="true" send="true"/> 
       </security-setting> 
       <address-setting name="#" redistribution-delay="1000" message-counter-history-day-limit="10" page-size-bytes="2097152" max-siz 
       <http-connector name="http-connector" endpoint="http-acceptor" socket-binding="http"/> 
       <http-connector name="http-connector-throughput" endpoint="http-acceptor-throughput" socket-binding="http"> 
        <param name="batch-delay" value="50"/> 
       </http-connector> 
       <in-vm-connector name="in-vm" server-id="0"/> 
       <http-acceptor name="http-acceptor" http-listener="default"/> 
       <http-acceptor name="http-acceptor-throughput" http-listener="default"> 
        <param name="batch-delay" value="50"/> 
        <param name="direct-deliver" value="false"/> 
       </http-acceptor> 
       <in-vm-acceptor name="in-vm" server-id="0"/> 
       <broadcast-group name="bg-group1" connectors="http-connector" jgroups-channel="activemq-cluster" jgroups-stack="tcphq"/> 
       <discovery-group name="dg-group1" jgroups-channel="activemq-cluster" jgroups-stack="tcphq"/> 
       <cluster-connection name="my-cluster" discovery-group="dg-group1" connector-name="http-connector" address="jms"/> 
       <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/> 
       <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/> 
       <jms-queue name="TestQ" entries="java:jboss/exported/jms/queue/testq"/> 
       <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/> 
       <connection-factory name="RemoteConnectionFactory" reconnect-attempts="-1" block-on-acknowledge="true" ha="true" entries="java 
       <pooled-connection-factory name="activemq-ra" transaction="xa" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" co 
      </server> 
     </subsystem> 

la configuration est plus ou moins défaut, à l'exception ajouté TestQ file d'attente.

tcphq pile est défini dans la configuration JGroups comme suit:

   <stack name="tcphq"> 
        <transport type="TCP" socket-binding="jgroups-tcp-hq"/> 
        <protocol type="TCPPING"> 
         <property name="initial_hosts"> 
          dev1[7660],dev1[7810],dev1[7960],dev2[7660],dev2[7810],dev2[7960] 
         </property> 
         <property name="port_range"> 
          0 
         </property> 
        </protocol> 
        <protocol type="MERGE3"/> 
        <protocol type="FD_SOCK" socket-binding="jgroups-tcp-hq-fd"/> 
        <protocol type="FD"/> 
        <protocol type="VERIFY_SUSPECT"/> 
        <protocol type="pbcast.NAKACK2"/> 
        <protocol type="UNICAST3"/> 
        <protocol type="pbcast.STABLE"/> 
        <protocol type="pbcast.GMS"/> 
        <protocol type="MFC"/> 
        <protocol type="FRAG2"/> 
       </stack> 

J'ai écrit une application de test consistant à partir d'un simple "serveur", MDB sens et un client comme suit:

Server (MDB):

@MessageDriven(mappedName = "test", activationConfig = { 
    @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"), 
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:jboss/exported/jms/queue/testq"), 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") 
}) 
public class MessageServer implements MessageListener { 

    @Override 
    public void onMessage(Message message) { 

     try { 
      ObjectMessage msg = null; 

      if (message instanceof ObjectMessage) { 
       msg = (ObjectMessage) message; 
      } 
      System.out.print("The number in the message: "+ msg.getIntProperty("count")); 
     } catch (JMSException ex) { 
      Logger.getLogger(MessageServer.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

Client:

@Singleton 
@Startup 
public class ClientBean implements ClientBeanLocal { 

    @Resource(mappedName = "java:jboss/exported/jms/RemoteConnectionFactory") 
    private ConnectionFactory factory; 

    @Resource(mappedName = "java:jboss/exported/jms/queue/testq") 
    private Queue queue; 

    @PostConstruct 
    public void sendMessage() { 

     Connection connection = null; 
     try { 

      connection = factory.createConnection(); 
      Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
      MessageProducer producer = session.createProducer(queue); 

      Message message = session.createObjectMessage(); 
      message.setIntProperty("count", 1); 

      producer.send(message); 
      System.out.println("Message sent."); 

     } catch (JMSException ex) { 
      Logger.getLogger(ClientBean.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (NamingException ex) { 
      Logger.getLogger(ClientBean.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 
      try { 
       if (connection != null) connection.close(); 
      } catch (JMSException ex) { 
       Logger.getLogger(ClientBean.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 

} 

Il fonctionne en réalité bien si le client et le serveur se trouvent dans le même groupe. Dans un tel cas, il semble même qu'il communique entre les hôtes (nœuds). Toutefois, si le serveur et le client appartiennent à des groupes différents, MDB n'est pas appelé. De plus, il semble même que MDB n'est invoqué que s'il réside dans le groupe avec 0 offset. Lorsque j'ai déplacé le serveur MDB dans un groupe différent, il ne répondait pas même si le client appartenait au même groupe.

Je suis un peu confus au sujet de JMS dans Wildfly 10. Il y a beaucoup d'exemples et de matériaux pour les anciennes versions avec HornetQ, mais très peu pour Artemis. Quelqu'un pourrait-il aider? Merci beaucoup.

+0

Eh bien, je me suis retrouvé ici à la recherche de comment configurer le sous-système 'jboss : domain: messaging-activemq: 1.0' pour se connecter à un serveur ActiveMQ distant. Une idée? –

+0

L'un d'entre vous a-t-il réellement résolu cela? Comme nous sommes en train de trébucher sur un problème similaire actuellement et je suppose: si votre déploiement se trouve sur un groupe de serveurs différent, il se trouve sur une instance différente de wildfly - il semble que cela doit être géré en quelque sorte à distance. – PepperBob

Répondre

0

Comme je suis venu avec la même question - mettre la réponse qui fonctionne pour moi.

En fait, comme Miroslav answered on developer.jboss.org la première chose à vérifier est socket-binding pour le "jgroups-tcp-hq" et la configuration port-offset sur chaque serveur.
Devrait être <socket-binding name="jgroups-tcp-hq" ... port="7600"/> et port-offset est défini (par exemple avec la propriété jboss.socket.binding.port-offset) sur 60 sur dev1 [7660] serveur; 210 sur dev1 [7810]; 360 sur dev1 [7960]. Idem pour dev2 serveurs. La seconde est la propriété jboss.bind.address.private.
Habituellement, les jgroups par défaut socket-binding se réfèrent à l'interface "private", par ex.

<socket-binding name="jgroups-tcp-hq" interface="private" port="7600"/> 

Donc, adresse de l'interface "private" doit être fournie avec la propriété jboss.bind.address.private (par exemple jboss.bind.address.private=dev1) - autrement ClusterConnectionBridge ne sera pas établie entre les nœuds!
See also this post for more details.

Si la communication entre les instances de serveur ActiveMQ est alors établie l'entrée du journal doit apparaître dans server.log: AMQ221027: Bridge [email protected] [name=sf.my-cluster ...] is connected.
See also this answer.