PS:这只是一个测试,
rabbit是在本地的环境,先开启rabbitMQ的服务器
C#的Provider
代码是直接拿的RabbitMQ官网里的,可以直接拿来用
class Program
{
static string QueueName = "task_queue";
static IConnection connection;
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "127.0.0.1", UserName = "testUser", Password = "12345" };
connection = factory.CreateConnection();
Run();
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
private static void Run()
{
while (true)
{
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: QueueName,
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
var message = GetMessage(DateTime.Now.ToString("HH:mm:ss")+"I have send to you Java,Did you receive it");
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
channel.BasicPublish(exchange: "",
routingKey: QueueName,
basicProperties: properties,
body: body);
Console.WriteLine(" [x] Sent {0}", message);
Console.ReadLine();
}
}
}
private static string GetMessage(string args)
{
return "Hello World! " + args;
}
}
Java的Customer
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("testUser");
factory.setPassword("12345");
// 2.创建连接
Connection connection = factory.newConnection();
// 3.创建频道
Channel channel = connection.createChannel();
// 4.创建队列
channel.queueDeclare("task_queue", true, false, false, null);
// 5. 接收消息
channel.basicConsume("task_queue", true, new DefaultConsumer(channel) {
// 回调方法,当收到消息之后,会自动执行该方法
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties,byte[] body)
throws IOException {
System.out.println("body:" + new String(body));
}
});
// 不释放资源,让rabbitmq一直监听
}
结果
先运行C#的Provider,
产生了一条消息
再启动Java的Customer
消息被消费掉了。
反过来也很简单,只需要注释Java的接收代码,添加发送消息的代码即可
BasicProperties properties = new BasicProperties();
channel.basicPublish("", "task_queue", properties, "From Java Project To C#".getBytes());
C#的接收也同理
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: QueueName,
autoAck: false,
consumer: consumer);