我们知道KeywordMessage就是被kafka发送和存储的对象。所以只需要模拟出这个就可以发送自定义消息了。
比如我需要将用户的id,user,age,address和访问ip和访问date记录为一个消息。我就自定义一个消息格式(id-user-age-address-ip-date)。
我立马想到自己定义个javaBean.写一个UserInfo类伪代码。
class UserInfo(){
id;
user;
age;
address;
ip;
date;
toString(){
return this.getId()+"-"+this.getUser()+"-"+"..."+this.getDate();
}
}
你以为这样就可以了吗?当然不行啊!
还要按照kafka的消息类型进行封装,在这里我们只需要实现Encoder类即可:继续看看代码就好;
public class KeywordMessage implements kafka.serializer.Encoder<UserInfo>{
public static final Logger LOG=LoggerFactory.getLogger(UserInfo.class);
@Override
public Message toMessage(Keyword words) {
LOG.info("start in encoding...");
return new Message(words.toString().getBytes());
}
}
这样KeywordMessage就是一个可以被kafka发送和存储的对象了。
我们再看看producer,producer数据的推送到broker的,所以发起者还是业务系统,下面的代码就能直接发送一次数据。
/**配置producer必要的参数*/
Properties props = new Properties();
必要的一些配置省略。。。
/**选择用哪个类来进行序列化,就是我们自定义的消息类*/
props.put("serializer.class", "org.kafka.message.UserInfo");
ProducerConfig config=new ProducerConfig(props);
/**构造测试数据*/
UserInfo userInfo = new UserInfo();
userInfo
.setId(1);
userInfo.setUser("xiaoming");
...
List<UserInfo> msg=new ArrayList<UserInfo>();
msg.add(userInfo);
/**构造数据发送对象*/
Producer<String, UserInfo> producer=new Producer<String, UserInfo>(config);
ProducerData<String,UserInfo> data=new ProducerData<String, UserInfo>("test", msg);
producer.send(data);
以上就是自定义封装消息内容。
