pom文件
<properties>
<java.version>1.8</java.version>
<rabbitMQ.version>3.5.1</rabbitMQ.version>
<spring.version>4.1.7.RELEASE</spring.version>
<mongodb.version>1.8.0.RELEASE</mongodb.version>
<mybatis.version>3.4.1</mybatis.version>
<mybatis.spring.version>1.3.0</mybatis.spring.version>
<mysql.driver.version>5.1.39</mysql.driver.version>
<druid.version>1.0.27</druid.version>
<org.aspectj.version>1.8.9</org.aspectj.version>
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<grpc.version>1.13.2</grpc.version>
<protobuf.version>3.6.0</protobuf.version>
<os.detected.classifier>windows-x86_64</os.detected.classifier>
</properties>
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<excludes>
<exclude>conf/*.properties</exclude>
</excludes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>conf/${profiles.active}.properties</include>
</includes>
</resource>
</resources>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.6.0</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.1</version>
<configuration>
<protoSourceRoot>${basedir}/src/main/proto</protoSourceRoot>
<protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<!--插件生成类目录,默认在target/xx下,指定避免打包时报类重复错误-->
<outputDirectory>${basedir}/src/main/java</outputDirectory>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
<!--不清楚目录下文件,直接覆盖-->
<clearOutputDirectory>false</clearOutputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!--区分开发测试生产环境-->
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profiles.active>dev</profiles.active>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
<profile>
<id>release</id>
<properties>
<profiles.active>release</profiles.active>
</properties>
</profile>
</profiles>
目录结构如下
Consumer.proto文件
syntax = "proto3";
package com.grpc.proto;
option java_package = "com.grpc.proto";
option java_outer_classname = "ConsumerProto";
option java_multiple_files = true;
service ConsumerService {
rpc GetMessageSequence(MessageRequest) returns (MessageResponse) {}
}
message MessageRequest {
string family_id = 1;
string user_id = 2;
string device_id = 3;
int32 device_type = 4;
int32 type = 5;
int32 sequence = 6;
int32 classified_sequence = 7;
}
message MessageResponse {
int32 sequence = 1;
int32 classified_sequence = 2;
}
ConsumerService.java 文件
public class ConsumerService {
final Logger logger = LoggerFactory.getLogger(ConsumerService.class);
private Server server;
private void start() throws IOException {
this.server = ServerBuilder.forPort(8899).addService(new ConsumerServiceGrpcImpl()).build().start();
logger.info("ConsumerServiceGrpcImpl server started!");
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
logger.info("关闭jvm");
ConsumerService.this.stop();
}));
}
private void stop() {
if(null != this.server) {
this.server.shutdown();
}
}
private void awaitTermination() throws InterruptedException {
if(null != this.server) {
this.server.awaitTermination();
}
}
public static void main(String[] args) throws IOException, InterruptedException {
ConsumerService server = new ConsumerService();
server.start();
server.awaitTermination();
}
}
ConsumerClient.java 文件
@Component
@Scope("prototype")
public class ConsumerClient {
final Logger logger = LoggerFactory.getLogger(ConsumerClient.class);
private ManagedChannel managedChannel;
private ConsumerServiceGrpc.ConsumerServiceBlockingStub blockingStub;
@Autowired
public ConsumerClient(@Value("${serviceip}") String serviceip){
managedChannel = ManagedChannelBuilder.forAddress(serviceip, 8899).usePlaintext().build();
blockingStub = ConsumerServiceGrpc.newBlockingStub(managedChannel);
}
public void shutdown() throws InterruptedException {
managedChannel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
public MessageResponse getMessageSequence(Message msg){
MessageRequest messageRequest = MessageRequest.newBuilder()
.setDeviceId(msg.getDeviceId())
.build();
logger.info("==={}"+messageRequest.toString());
return blockingStub.getMessageSequence(messageRequest);
}
}
ConsumerServiceGrpcImpl.java 文件
public class ConsumerServiceGrpcImpl extends ConsumerServiceGrpc.ConsumerServiceImplBase {
final Logger logger = LoggerFactory.getLogger(ConsumerServiceGrpcImpl.class);
//private MongoDBMessageService service = (MongoDBMessageService)SpringContextUtil.getBeanByClass(MongoDBMessageService.class);
@Override
public void getMessageSequence(MessageRequest msg, StreamObserver<MessageResponse> responseObserver) {
logger.info("接受到客户端信息: " + msg.toString());
//业务代码 service
MessageResponse response = MessageResponse.newBuilder().setSequence(1).setClassifiedSequence(2).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
这里实现的业务就是消费mq消息,msg -> 处理 ->返回结果 ->写mongo
消费mq MessageConsumer.java 文件
public class MessageConsumer extends Logging implements MessageListener {
@Autowired
private MongoDBMessageService service;
@Autowired
ConsumerClient consumerClient;
@Override
public void onMessage(Message message) {
try {
String line = new String(message.getBody(), "UTF-8");
com.mongo.entity.Message msg = JSON.parseObject(line, com.mongo.entity.Message.class);
MessageResponse messageSequence = consumerClient.getMessageSequence(msg);
msg.setSequence(messageSequence.getSequence());
msg.setClassifiedSequence(messageSequence.getClassifiedSequence());
msg.setMessageId(Tools.getUUID());
logger.info("line======MessageConsumer======== {}", msg);
service.insert(msg, "message1");
} catch (Exception e) {
logger.error("MessageConsumer error.", e);
}
}
}