/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package backtype.storm.messaging;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBufferOutputStream;
import org.jboss.netty.buffer.ChannelBuffers;
public class TaskMessage implements NettyMessage {
public final static short NORMAL_MESSAGE = 0;
public final static short CONTROL_MESSAGE = 1;
public final static short BACK_PRESSURE_REQUEST = 2;
private final short _type; //0 means task message , 1 means task control message
private int _sourceTask = 0;
private int _task;
private byte[] _message;
public TaskMessage(int task, byte[] message) {
_type = NORMAL_MESSAGE;
_task = task;
_message = message;
}
public TaskMessage(int sourceTask, int task, byte[] message) {
_type = NORMAL_MESSAGE;
_sourceTask = sourceTask;
_task = task;
_message = message;
}
public TaskMessage(short type, int task, byte[] message) {
_type = type;
_task = task;
_message = message;
}
public TaskMessage(short type, int sourceTask, int task, byte[] message) {
_type = type;
_sourceTask = sourceTask;
_task = task;
_message = message;
}
public short get_type() {
return _type;
}
public int sourceTask() {
return _sourceTask;
}
public int task() {
return _task;
}
public byte[] message() {
return _message;
}
@Override
public boolean isEmpty() {
return _message == null || _message.length == 0;
}
@Override
public int getEncodedLength() {
if (_message == null) {
return 0;
}
return _message.length;
}
/**
* create a buffer containing the encoding of this batch
*/
@Override
public ChannelBuffer buffer() throws Exception {
int payloadLen = 0;
if (_message != null)
payloadLen = _message.length;
int totalLen = 8 + payloadLen;
ChannelBufferOutputStream bout = new ChannelBufferOutputStream(ChannelBuffers.directBuffer(totalLen));
bout.writeShort(_type);
if (_task > Short.MAX_VALUE)
throw new RuntimeException("Task ID should not exceed " + Short.MAX_VALUE);
bout.writeShort((short) _task);
bout.writeInt(payloadLen);
if (payloadLen > 0)
bout.write(_message);
bout.close();
return bout.buffer();
}
}