Hi, I'm trying to build a translator that processes FIX messages and
translate the parameters into the query string of a HTTP request. I'am using
bindy but I don't seem to get the hang of it.
I created a route and three model classes:
package gateway;
public class MyRouteBuilder extends RouteBuilder {
public void configure() {
BindyKeyValuePairDataFormat camelDataFormat = new
BindyKeyValuePairDataFormat("gateway.model");
from("quickfix:config.cfg").
choice().
when(header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.ORDER_SINGLE)).
unmarshal(camelDataFormat).
to("http4://www.server.com").
otherwise().
to("log:localhost");
}
}
package gateway.model;
@Message(keyValuePairSeparator = "=", pairSeparator = "\\u0001", type =
"FIX", version = "4.4")
public class Order{
@Link
Header header;
@Link
Trailer trailer;
@KeyValuePairField(tag = 1)
// Client reference
private String account;
@KeyValuePairField(tag = 11)
// Order reference
private String clOrdId;
@KeyValuePairField(tag = 22)
// Fund ID type (Sedol, ISIN, ...)
private String iDSource;
@KeyValuePairField(tag = 48)
// Fund code
private String securityId;
@KeyValuePairField(tag = 54)
// Movement type ( 1 = Buy, 2 = sell)
private String side;
@KeyValuePairField(tag = 58)
// Free text
private String text;
public Header getHeader() {
return header;
}
public void setHeader(Header header) {
this.header = header;
}
public Trailer getTrailer() {
return trailer;
}
public void setTrailer(Trailer trailer) {
this.trailer = trailer;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getClOrdId() {
return clOrdId;
}
public void setClOrdId(String clOrdId) {
this.clOrdId = clOrdId;
}
public String getIDSource() {
return iDSource;
}
public void setIDSource(String source) {
this.iDSource = source;
}
public String getSecurityId() {
return securityId;
}
public void setSecurityId(String securityId) {
this.securityId = securityId;
}
public String getSide() {
return side;
}
public void setSide(String side) {
this.side = side;
}
public String getText() {
return this.text;
}
public void setText(String text) {
this.text = text;
}
@Override
public String toString() {
return Order.class.getName() + " --> 1: " + this.account + ", 11: "
+ this.clOrdId + ", 22: " + this.iDSource + ", 48: " + this.securityId + ",
54: " + this.side
+ ", 58: " + this.text;
}
}
package gateway.model;
@Link
public class Header{
@KeyValuePairField(tag = 8)
// Message Header
private String beginString;
@KeyValuePairField(tag = 9)
// Checksum
private int bodyLength;
@KeyValuePairField(tag = 34)
// Sequence number
private int msgSeqNum;
@KeyValuePairField(tag = 35)
// Message Type
private String msgType;
@KeyValuePairField(tag = 49)
// Company sender Id
private String sendCompId;
@KeyValuePairField(tag = 56)
// target company id
private String targetCompId;
public String getBeginString() {
return beginString;
}
public void setBeginString(String beginString) {
this.beginString = beginString;
}
public int getBodyLength() {
return bodyLength;
}
public void setBodyLength(int bodyLength) {
this.bodyLength = bodyLength;
}
public int getMsgSeqNum() {
return msgSeqNum;
}
public void setMsgSeqNum(int msgSeqNum) {
this.msgSeqNum = msgSeqNum;
}
public String getMsgType() {
return msgType;
}
public void setMsgType(String msgType) {
this.msgType = msgType;
}
public String getSendCompId() {
return sendCompId;
}
public void setSendCompId(String sendCompId) {
this.sendCompId = sendCompId;
}
public String getTargetCompId() {
return targetCompId;
}
public void setTargetCompId(String targetCompId) {
this.targetCompId = targetCompId;
}
@Override
public String toString() {
return Header.class.getName() + " --> 8: " + this.beginString + ",
9: " + this.bodyLength + ", 34: " + this.msgSeqNum + " , 35: " +
this.msgType + ", 49: "
+ this.sendCompId + ", 56: " + this.targetCompId;
}
}
package gateway.model;
@Link
public class Trailer{
@KeyValuePairField(tag = 10)
// CheckSum
private int checkSum;
public int getCheckSum() {
return checkSum;
}
public void setCheckSum(int checkSum) {
this.checkSum = checkSum;
}
@Override
public String toString() {
return Trailer.class.getName() + " --> 10: " + this.checkSum;
}
}
Whenever I run the example and I receive a new order, I get an exception
[ QFJ Message Processor] DefaultErrorHandler ERROR Failed
delivery for exchangeId: ID-Sinac-3-4710-1308159740143-0-6. Exhausted after
delivery attempt: 1 caught: org.apache.camel.InvalidPayloadException: No
body available of type: java.io.InputStream but has value: 8=FIX.4.4..... of
type: quickfix.fix44.NewOrderSingle on: Message: 8=FIX.4.4.... Caused by: No
type converter available to convert from type: quickfix.fix44.NewOrderSingle
to the required type: java.io.InputStream with value 8=FIX.4.4....
Exchange[Message: 8=FIX.4.4...]. Caused by:
[org.apache.camel.NoTypeConversionAvailableException - No type converter
available to convert from type: quickfix.fix44.NewOrderSingle to the
required type: java.io.InputStream with value
I don't quite get what I must do to perform the translation.
Any pointers would be appreciated
Pablo