2016-05-20 13 views
0

Ich dachte, dass es einfach möglich ist, mehrere JChannels (mit unterschiedlichen Namen) im selben Cluster zu haben. Ich muss folgende Konfiguration:Mehrere JChannels in einem Cluster

@Singleton 
public class ChannelOne extends ReceiverAdapter 
{ 
    JChannel channel; 

    public void start() 
    { 
     channel = new JChannel(); 

     channel.setReceiver(this); 
     channel.connect("ChannelOne"); 
    } 

    public void receive(Message msg) 
    { 
     DataObject data = (DataObject) msg.getObject(); 
     log.debug("JGroups: Message received event received: " + data.eventData); 
    } 

    public void send(DataObject data) 
    { 
     Message msg = new Message(null, null, data); 
     log.debug("JGroups: send: " + data.eventData); 
     channel.send(msg); 
    } 

    public void viewAccepted(View new_view) 
    { 
     log.debug("JGroups: View accepted: " + new_view); 
    } 

} 

Und meine JGroups Konfiguration ist die folgende (auf Openshift verwendet wird, in denen wir nicht UDP verwenden können - How to open a JChannel (JGroups) using Openshift Wildfly 8 Cartridge!)

<config xmlns="urn:org:jgroups" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/JGroups-3.3.xsd"> 
    <TCP 
      external_addr="${env.OPENSHIFT_GEAR_DNS}" 
      external_port="${env.OPENSHIFT_WILDFLY_CLUSTER_PROXY_PORT}" 
      bind_port="${env.OPENSHIFT_WILDFLY_CLUSTER_PORT}" 
      bind_addr="${env.OPENSHIFT_WILDFLY_IP}" 
      defer_client_bind_addr="true" 
      enable_diagnostics="false"/> 

    <TCPPING timeout="3000" 
      initial_hosts="${env.OPENSHIFT_WILDFLY_CLUSTER}" 
      port_range="0" 
      num_initial_members="1"/> 
    <MERGE2/> 
    <FD/> 
    <VERIFY_SUSPECT/> 
    <BARRIER/> 
    <pbcast.NAKACK2 
      use_mcast_xmit="false"/> 
    <UNICAST3/> 
    <pbcast.STABLE/> 
    <pbcast.GMS/> 
    <MFC/> 
    <FRAG2/> 
</config> 

Nehmen wir nun an, dass wir nicht nur eine ChannelOne aber auch eine ChannelTwo Singleton mit dem Ziel, Ereignisse durch ihre Verwendung zu trennen.

Wenn ich dies tue, beobachte ich, dass die Nachrichten nicht alle richtig empfangen werden. Es scheint eine Mischung zwischen den beiden Kanälen zu geben. Ich habe eine Menge Warnungen im Protokoll, dass Nachrichten gelöscht wurden.

Was verstehe ich falsch in diesem Konzept der Kanäle?

Antwort

1

Ein Kanal ist ein Endpunkt in einem Cluster. Wenn Sie verschiedene Anwendungen verwenden, die verschiedene Cluster verwenden, müssen Sie die Cluster trennen, da die Apps sonst die Nachrichten des anderen empfangen.

Wählen Sie dazu verschiedene Ports (, bind_port) für die verschiedenen Cluster aus.

+0

Das heißt, wenn nur ein Port für das Clustering reserviert ist, der vom Cloud-Dienst (OpenShift) bereitgestellt wird, ist nur ein Kanal möglich? – badera

+0

Ich weiß nicht, wie OpenShift funktioniert. Wenn sie nur einen einzelnen Port bereitstellen, können Sie nicht mehrere Kanäle erstellen. Wenn sie jedoch eine Reihe von Bind-Adressen bereitstellen, können Sie eine Bindung an eine andere Bind-Adresse, aber denselben Port herstellen. Ich schlage vor, fragen Sie die OpenShift Clustering Jungs ... –