/**
   * @param destination Member[] - destination.length > 0
   * @param msg Serializable - the message to send
   * @param options sender options, options can trigger guarantee levels and different interceptors
   *     to react to the message see class documentation for the <code>Channel</code> object.<br>
   * @param handler - callback object for error handling and completion notification, used when a
   *     message is sent asynchronously using the <code>Channel.SEND_OPTIONS_ASYNCHRONOUS</code>
   *     flag enabled.
   * @return UniqueId - the unique Id that was assigned to this message
   * @throws ChannelException - if an error occurs processing the message
   * @see org.apache.catalina.tribes.Channel
   */
  @Override
  public UniqueId send(Member[] destination, Serializable msg, int options, ErrorHandler handler)
      throws ChannelException {
    if (msg == null) throw new ChannelException(sm.getString("groupChannel.nullMessage"));
    XByteBuffer buffer = null;
    try {
      if (destination == null || destination.length == 0) {
        throw new ChannelException(sm.getString("groupChannel.noDestination"));
      }
      ChannelData data = new ChannelData(true); // generates a unique Id
      data.setAddress(getLocalMember(false));
      data.setTimestamp(System.currentTimeMillis());
      byte[] b = null;
      if (msg instanceof ByteMessage) {
        b = ((ByteMessage) msg).getMessage();
        options = options | SEND_OPTIONS_BYTE_MESSAGE;
      } else {
        b = XByteBuffer.serialize(msg);
        options = options & (~SEND_OPTIONS_BYTE_MESSAGE);
      }
      data.setOptions(options);
      // XByteBuffer buffer = new XByteBuffer(b.length+128,false);
      buffer = BufferPool.getBufferPool().getBuffer(b.length + 128, false);
      buffer.append(b, 0, b.length);
      data.setMessage(buffer);
      InterceptorPayload payload = null;
      if (handler != null) {
        payload = new InterceptorPayload();
        payload.setErrorHandler(handler);
      }
      getFirstInterceptor().sendMessage(destination, data, payload);
      if (Logs.MESSAGES.isTraceEnabled()) {
        Logs.MESSAGES.trace(
            "GroupChannel - Sent msg:"
                + new UniqueId(data.getUniqueId())
                + " at "
                + new java.sql.Timestamp(System.currentTimeMillis())
                + " to "
                + Arrays.toNameString(destination));
        Logs.MESSAGES.trace(
            "GroupChannel - Send Message:" + new UniqueId(data.getUniqueId()) + " is " + msg);
      }

      return new UniqueId(data.getUniqueId());
    } catch (Exception x) {
      if (x instanceof ChannelException) throw (ChannelException) x;
      throw new ChannelException(x);
    } finally {
      if (buffer != null) BufferPool.getBufferPool().returnBuffer(buffer);
    }
  }
Beispiel #2
0
  public static void main(String[] args) throws Exception {

    Member mbr = new MemberImpl("localhost", 9999, 0);
    ChannelData data = new ChannelData();
    data.setOptions(Channel.SEND_OPTIONS_BYTE_MESSAGE);
    data.setAddress(mbr);
    byte[] buf = new byte[8192 * 4];
    data.setMessage(new XByteBuffer(buf, false));
    buf = XByteBuffer.createDataPackage(data);
    int len = buf.length;
    System.out.println("Message size:" + len + " bytes");
    BigDecimal total = new BigDecimal((double) 0);
    BigDecimal bytes = new BigDecimal((double) len);
    Socket socket = new Socket("localhost", 9999);
    System.out.println("Writing to 9999");
    OutputStream out = socket.getOutputStream();
    long start = 0;
    double mb = 0;
    boolean first = true;
    int count = 0;
    DecimalFormat df = new DecimalFormat("##.00");
    while (count < 1000000) {
      if (first) {
        first = false;
        start = System.currentTimeMillis();
      }
      out.write(buf, 0, buf.length);
      mb += ((double) buf.length) / 1024 / 1024;
      total = total.add(bytes);
      if (((++count) % 10000) == 0) {
        long time = System.currentTimeMillis();
        double seconds = ((double) (time - start)) / 1000;
        System.out.println(
            "Throughput "
                + df.format(mb / seconds)
                + " MB/seconds messages "
                + count
                + ", total "
                + mb
                + " MB, total "
                + total
                + " bytes.");
      }
    }
    out.flush();
    System.out.println("Complete, sleeping 5 seconds");
    Thread.sleep(5000);
  }
  protected static boolean memberAlive(
      Member mbr,
      byte[] msgData,
      boolean sendTest,
      boolean readTest,
      long readTimeout,
      long conTimeout,
      int optionFlag) {
    // could be a shutdown notification
    if (Arrays.equals(mbr.getCommand(), Member.SHUTDOWN_PAYLOAD)) return false;

    Socket socket = new Socket();
    try {
      InetAddress ia = InetAddress.getByAddress(mbr.getHost());
      InetSocketAddress addr = new InetSocketAddress(ia, mbr.getPort());
      socket.setSoTimeout((int) readTimeout);
      socket.connect(addr, (int) conTimeout);
      if (sendTest) {
        ChannelData data = new ChannelData(true);
        data.setAddress(mbr);
        data.setMessage(new XByteBuffer(msgData, false));
        data.setTimestamp(System.currentTimeMillis());
        int options = optionFlag | Channel.SEND_OPTIONS_BYTE_MESSAGE;
        if (readTest) options = (options | Channel.SEND_OPTIONS_USE_ACK);
        else options = (options & (~Channel.SEND_OPTIONS_USE_ACK));
        data.setOptions(options);
        byte[] message = XByteBuffer.createDataPackage(data);
        socket.getOutputStream().write(message);
        if (readTest) {
          int length = socket.getInputStream().read(message);
          return length > 0;
        }
      } // end if
      return true;
    } catch (SocketTimeoutException sx) {
      // do nothing, we couldn't connect
    } catch (ConnectException cx) {
      // do nothing, we couldn't connect
    } catch (Exception x) {
      log.error("Unable to perform failure detection check, assuming member down.", x);
    } finally {
      try {
        socket.close();
      } catch (Exception ignore) {
      }
    }
    return false;
  }
  public static void main(String[] args) throws Exception {
    Selector selector = Selector.open();
    Member mbr = new MemberImpl("localhost", 9999, 0);
    ChannelData data = new ChannelData();
    data.setOptions(Channel.SEND_OPTIONS_BYTE_MESSAGE);
    data.setAddress(mbr);
    byte[] buf = new byte[8192 * 4];
    data.setMessage(new XByteBuffer(buf, false));
    buf = XByteBuffer.createDataPackage(data);
    int len = buf.length;
    BigDecimal total = new BigDecimal((double) 0);
    BigDecimal bytes = new BigDecimal((double) len);
    NioSender sender = new NioSender();
    sender.setDestination(mbr);
    sender.setDirectBuffer(true);
    sender.setSelector(selector);
    sender.setTxBufSize(1024 * 1024);
    sender.connect();
    sender.setMessage(buf);
    System.out.println("Writing to 9999");
    long start = 0;
    double mb = 0;
    boolean first = true;
    int count = 0;
    DecimalFormat df = new DecimalFormat("##.00");
    while (count < 100000) {
      if (first) {
        first = false;
        start = System.currentTimeMillis();
      }
      sender.setMessage(buf);
      int selectedKeys = 0;
      try {
        selectedKeys = selector.select(0);
      } catch (Exception e) {
        e.printStackTrace();
        continue;
      }

      if (selectedKeys == 0) {
        continue;
      }

      Iterator it = selector.selectedKeys().iterator();
      while (it.hasNext()) {
        SelectionKey sk = (SelectionKey) it.next();
        it.remove();
        try {
          int readyOps = sk.readyOps();
          sk.interestOps(sk.interestOps() & ~readyOps);
          if (sender.process(sk, false)) {
            total = total.add(bytes);
            sender.reset();
            sender.setMessage(buf);
            mb += ((double) len) / 1024 / 1024;
            if (((++count) % 10000) == 0) {
              long time = System.currentTimeMillis();
              double seconds = ((double) (time - start)) / 1000;
              System.out.println(
                  "Throughput "
                      + df.format(mb / seconds)
                      + " MB/seconds, total "
                      + mb
                      + " MB, total "
                      + total
                      + " bytes.");
            }
          }

        } catch (Throwable t) {
          t.printStackTrace();
          return;
        }
      }
      selector.selectedKeys().clear();
    }
    System.out.println("Complete, sleeping 15 seconds");
    Thread.sleep(15000);
  }