Re: [jgroups-users] v3->v4: my ReceiverAdapter methods are not being called

Questions/problems related to using JGroups <[email protected]> Mon, 6 Nov 2017 14:37:56 +0100
Newsgroups gmane.comp.java.javagroups.general
Message-ID <mailman.25519.1509975516.12767.javagroups-users@lists.sourceforge.net>
Your methods are never called because the MessageDispatcher catches all 
of these messages! So JChannel.setReceiver(this) is setting a receiver 
that won't ever get called.

If you have a MessageDispatcher, receive(Message) and 
receive(MessageBatch) are never called; instead either handle(Message) 
or handle(Message,Response) are going to be called.

Event such as view changes are caught by registering a 
MembershipListener directly with the MessageDispatcher 
(setMembershipListener()), state changes are registered for by calling 
MessageDispatcher.setStateListener().

Take a look at the simple program below that shows how to do this.
Cheers,

public class bla extends ReceiverAdapter implements RequestHandler {
     protected JChannel            ch;
     protected static final String props="/home/bela/fast.xml";
     protected MessageDispatcher   dispatcher;
     protected int cnt=1;

     protected void start(String name) throws Exception {
         ch=new JChannel(props).name(name);
         // ch.setReceiver(this); // useless receiver won't get called!
         dispatcher = new MessageDispatcher(ch, this);
         dispatcher.setMembershipListener(this);
         // dispatcher.setStateListener(this);
         ch.connect("demo", null, 10 * 1000);
         int num=1;
         for(;;) {
             Util.keyPress(">>");
             String tmp="msg-" + num++;
             RspList<Object> rsps=dispatcher.castMessage(null, new 
ByteArrayPayload(tmp.getBytes()), RequestOptions.SYNC());
             System.out.printf("rsps: %s\n", rsps);
         }
     }

     public static void main(String[] args) throws Exception {
         new bla().start(args[0]);
     }

     public void receive(Message msg) {
         System.out.printf("receive() called\n");
     }

     public void receive(MessageBatch batch) {
         System.out.printf("receiveBatch() called\n");
     }

     public void viewAccepted(View view) {
         System.out.printf("-- view: %s\n", view);
     }

     public Object handle(Message msg) throws Exception {
         System.out.printf("handle() called\n");
         return cnt++;
     }

     public void handle(Message request, Response response) throws 
Exception {
         Object retval=handle(request);
         response.send(retval, false);
     }
}


On 03/11/17 20:29, Questions/problems related to using JGroups wrote:
> Thank you for previous help with castMessage/handle and 
> serializable->streamable. That all went fine, and I can send messages 
> that way properly now across the cluster. Now I'm seeing a bigger 
> problem, but it's so easy to describe that am hopeful it's a simple RTFM 
> thing (though I've read it several times now).
> 
> None of my ReceiverAdapter methods are being called. Am trying 4.0.8 now 
> but also tried 4.0.7. I can tell from logs/debugger that nodes are 
> finding each other and joining, are sending messages from one to the 
> other [1], and a getState call is made [2]. I override receive, 
> get/setState, viewAccepted, and suspect, and none of them are called. 
> Note that this same code worked with v3.
> 
> My base class is declared with "extends ReceiverAdapter implements 
> RequestHandler" and I set up like this (unchanged from v3):
> 
>          jChannel = env.createJChannel(); // tried with name(<string>) also
>          jChannel.setReceiver(this);
>          dispatcher = new MessageDispatcher(jChannel, this);
>          jChannel.connect(<name>, null, 10 * 1000);
> 
> With channel creation like this:
> 
>          Protocol[] stack = {
>              new TCP()
>                  .setValue("bind_addr", InetAddress.getByName(<bind 
> address>))
>                  .setValue("bind_port", <port>)
>                  .setValue("thread_pool_min_threads", 1)
>                  .setValue("thread_pool_keep_alive_time", 5000)
>                  .setValue("send_buf_size", 640000)
>                  .setValue("sock_conn_timeout", 300)
>                  .setValue("recv_buf_size", 5000000),
>              new TCPPING()
>                  .setValue("initial_hosts", <list>)
>                  .setValue("send_cache_on_join", true)
>                  .setValue("port_range", 0),
>              new MERGE3()
>                  .setValue("min_interval", 10000)
>                  .setValue("max_interval", 30000),
>              new FD_ALL()
>                  .setValue("timeout", <timeout>),
>              new VERIFY_SUSPECT()
>                  .setValue("timeout", 1500),
>              new BARRIER(),
>              new NAKACK2()
>                  .setValue("use_mcast_xmit", false),
>              new UNICAST3(),
>              new STABLE()
>                  .setValue("desired_avg_gossip", 50000)
>                  .setValue("max_bytes", 4000000),
> //            createAuthProtocol(), <-- commented for now
>              new GMS()
>                  .setValue("join_timeout", 3000),
>              new MFC()
>                  .setValue("max_credits", 2000000)
>                  .setValue("min_credits", 800000),
>              new FRAG2(),
>              new STATE_TRANSFER()};
>          return new JChannel(stack);
> 
> Since *none* of my ReceiverAdapter code is being called, am hoping it's 
> something dumb. I stepped into the receive case to try to figure it out 
> and found here is where the message is being swallowed:
> 
> RequestCorrelator, called by MessageDispatcher. hdr = null:
> 
>      public void receiveMessageBatch(MessageBatch batch) {
>          for(Message msg : batch) {
>              Header hdr=msg.getHeader(this.corr_id);
>              if(hdr == null || hdr.corrId != this.corr_id) // msg was 
> sent by a different request corr in the same stack
>                  continue;
> 
>              if(hdr instanceof MultiDestinationHeader) {
>                  [...]
>              }
>              dispatch(msg, hdr);
>          }
>      }
> 
> There is no header that matches this corr_id (200). The headers are 
> NakAckHeader2 (41) and
> TpHeader (57).
> 
> Thanks,
> Bobby
> 
> 
> [1] 11/3/17 12:03:56 PM org.jgroups.protocols.TP 
> <http://org.jgroups.protocols.TP> passBatchUp FINER: localhost-63787: 
> received message batch of 1 messages from localhost-63787
> 11/3/17 12:03:56 PM org.jgroups.protocols.pbcast.NAKACK2 handleMessages 
> FINER: localhost-63787: received localhost-63787#1-1 (1 messages)
> 
> [2] 11/3/17 11:51:00 AM org.jgroups.protocols.pbcast.STATE_TRANSFER 
> handleStateReq FINE: localhost-50939: received state request from 
> localhost-28424
> 
> 
> 
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> 
> 
> 
> _______________________________________________
> javagroups-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/javagroups-users
> 

-- 
Bela Ban | http://www.jgroups.org


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
javagroups-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/javagroups-users