1.配置文件
input为接收,output为发送
如果发送接收在同一个程序中,则不需要加上consumer: headerMode:raw ,如果本程序仅是接收消息进行消费,需要加上consumer: headerMode:raw
spring: cloud: stream: bindings: input-collect: contentType: text/plain;charset=UTF-8 destination: ACCOUNT_COLLECT_NOTIFY group: account-dev input-order: consumer: headerMode: raw contentType: text/plain;charset=UTF-8 destination: ACCOUNT_ORDER_NOTIFY group: account-dev output-collect: contentType: text/plain;charset=UTF-8 destination: ACCOUNT_COLLECT_NOTIFY output-watch: contentType: text/plain;charset=UTF-8 destination: ACCOUNT_WATCH_NOTIFY kafka: binder: brokers: 192.168.1.158:9092,192.168.1.159:9092,192.168.1.160:9092 zkNodes: 192.168.1.158:2181,192.168.1.159:2181,192.168.1.160:2181
2.发送消息outPut分类Bean
public interface NotifyMessageChannel { String COLLECT_OUTPUT = "output-collect"; String WATCH_OUTPUT ="output-watch" ; @Output(NotifyMessageChannel.COLLECT_OUTPUT) MessageChannel collectOutPut(); @Output(NotifyMessageChannel.WATCH_OUTPUT) MessageChannel watchOutPut(); }
3.发送消息service
NotifyMessageChannel中定义了2个发送MessageChannel,发送时可以直接.collectOutPut().send,选择不同的output进行发送
@Service @Slf4j @EnableBinding(NotifyMessageChannel.class) public class NotifyServiceImpl implements NotifyService { @Autowired private NotifyMessageChannel notifyMessageChannel; private ObjectMapper mapper = new ObjectMapper(); @Override public void sendUserCollectCourse(UserCollectCourseNotify userCollectCourseNotify) { try { Boolean result = notifyMessageChannel.collectOutPut().send(MessageBuilder.withPayload( mapper.writeValueAsString(userCollectCourseNotify)).build()) ; log.info("send result:"+result); } catch (Exception e) { log.error("Exception from create user UserCollectCourse.", e); } } }
4.接收消息input配置
public interface ReceiveMessageChannel { String COLLECT_INPUT = "input-collect"; String ORDER_INPUT ="input-order" ; @Input(ReceiveMessageChannel.COLLECT_INPUT) SubscribableChannel collectInput(); @Input(ReceiveMessageChannel.ORDER_INPUT) SubscribableChannel orderInput(); }
5.监听接收到的消息,进行消费处理
@Service @Slf4j @EnableBinding(ReceiveMessageChannel.class) public class CollectListener { private UserCollectCourseClient userCollectCourseService; private ObjectMapper mapper = new ObjectMapper(); public CollectListener(UserCollectCourseClient userCollectCourseClient) { this.userCollectCourseService = userCollectCourseClient; } @StreamListener(ReceiveMessageChannel.COLLECT_INPUT) public void process(Message<String> message) { log.debug("Received Notify:[{}]",message.toString()); String content = message.getPayload(); UserCollectCourseNotify uccn; try { uccn = mapper.readValue(content,UserCollectCourseNotify.class); log.debug("Received Notify:[userId:{},courseId:{}]",uccn.getUserId(),uccn.getCourseId()); if(uccn!=null){ log.info("receive UserCollectCourseNotify:"+uccn); // userCollectCourseService.saveUserCollectCourse(ucci); // log.debug("Save Collect to Mongo:[userId:{},courseId:{}]",ucci.getUserId(),ucci.getCourseId()); } } catch (Exception e) { log.warn("RECEIVE Collect NOTIFY ERROR:[message_body:{},error:{}]",message.toString(),e.getLocalizedMessage()); } } }