<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات CherikCoders</title>
        <link>https://virgool.io/CherikCoders/feed</link>
        <description>آموزش برنامه نویسی و غیره</description>
        <language>fa</language>
        <pubDate>2026-06-16 11:07:14</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/vuv7xhpudh17/cp88pg.png</url>
            <title>CherikCoders</title>
            <link>https://virgool.io/CherikCoders</link>
        </image>

                    <item>
                <title>معرفی DTO, Java Bean و POJO در جاوا</title>
                <link>https://virgool.io/CherikCoders/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-dto-java-bean-%D9%88-pojo-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-cunxyslgamdt</link>
                <description>سلام :)خب اجازه بدید از DTO شروع کنیم، DTO یا Data Transfer Object در جاوا یک شی جهت انتقال داده ها بین زیرسیستم ها یا بخش های متفاوت پروژه و یک الگوی طراحی سازمانی(aggregate) برای جمع آوری داده ها است.DTO, Java Bean, POJO
قبل اینکه بیشتر ادامه بدیم چنتا مفهوم رو باید روشن کنیم، POJO و Java Beanیک Plain Old Java Object (POJO) یک شیء معمولی جاوا است. که می تواند هر کلاسی باشد و هیچ محدودیت خاصی غیر از مواردی که توسط زبان جاوا تجویز شده است، محدود نمی شود و برای قابلیت استفاده مجدد و افزایش خوانایی ایجاد شده اند. public class CoffeePOJO {
   public String name;
   private List&lt;String&gt; ingredients;
   public CoffeePOJO(String name, List&lt;String&gt; ingredients) { 
            this.name = name;
       this.ingredients = ingredients;
   }

   void addIngredient(String ingredient) {
       ingredients.add(ingredient);
   }
}همانطور که در مثال بالا مشاهده میکنید ما یک کلاس معمولی جاوا داریم :) اما یکسری نکات وجود داره که کلاس بالا یک POJO هست اما یک Java Bean نیست چرا که Java Beanها از یک سری استانداردها تحت عنوان JavaBean standard پیروی میکنند و هرکلاس POJO که این استاندارد ها را داشته باشد یک Java Bean هستش.بر اساس این استاندارد، تمام ویژگی ها(properties) خصوصی هستند(private) و با متدهای getter و setter قابل دسترسی خواهند بود. علاوه بر این، یک سازنده بدون آرگ وجود داشته باشد. به همراه چند مورد دیگر.بنابر این یک Java Bean حتما یک POJO هستش، اما هر POJO نمیتواند Java Bean باشد :)public class CoffeeBEAN implements Serializable {
   private String name;
   private List&lt;String&gt; ingredients;
   public CoffeeBEAN() {
   }
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   public List&lt;String&gt; getIngredients() {
       return ingredients;
   }
   public void setIngredients(List&lt;String&gt; ingredients) {
       this.ingredients = ingredients;
   }
}پیاده سازی یک DTO: یک DTO را می توان به عنوان یک POJO یا یک جاوا Bean پیاده سازی کرد. مهمترین وظیفه DTO رفع نگرانی بین لایه presentation و domain model هستشبیایید یک سرویس rest کوچک برای توضیح این موضوع بنویسیم. مثال ما یک کافی شاپ با موجودیت های قهوه و مشتری داریم. هر دوی این ها موجودیت های جداگانه ای در سیستم هستند. اگر بخواهم قهوه مورد علاقه مشتری را بدانم، یک API ایجاد می کنم که داده های محاسبه شده را در FavoriteCoffeDTO را ارائه می دهد.کد مربوطه:@Entity
@Getter
@Setter
public class Coffee {
   private Long id;
   private String name;
   private List&lt;String&gt; ingredients;
   private String preparation;
}
@Entity 
@Getter 
@Setter
public class Customer {
   private Long id;
   private String firstName;
   private String lastName;
   private List&lt;Coffee&gt; coffees;
}
@Getter  
@Setter
public class FavoriteCoffeeDTO {
   private String name;
   private List&lt;String&gt; coffees;
}من لایه دامنه را از لایه ارائه در پیاده سازی بالا جدا کردم.در این مثال، من فیلدها را خصوصی کردم، به این معنی که برای دسترسی به فیلدها باید متدهای getter و setter ایجاد کنم. که ما از انوتیشن @Gettrو @Setter استفاده کردیم.کاربران اغلب انتخاب می کنند که استاندارد JavaBean را به طور کامل یا جزئی برای DTO دنبال کنند. البته این اجباری نیست، شما مختارید هر روشی را انتخاب کنید که با نیازهایتان مطابقت دارد. گزینه‌های دیگر عبارتند از عمومی کردن همه فیلدها و دسترسی مستقیم به آنها (مانند مثال زیر)، یا غیرقابل تغییر کردن شی با سازنده همه آرگ‌ها و برخی روش‌های دریافت‌کننده.public class FavoriteCoffeeDTO {
   public String name;
   public List&lt;String&gt; coffees;
}

String name = favCoffeeDTO.name;در ورژن های جدید جاوا می توانیم از record ها برای ایجاد DTOها استفاده کنیم که در یک مقاله به اون پرداختیم https://cherikcoders.ir/record-%d8%af%d8%b1-%d8%ac%d8%a7%d9%88%d8%a7/ مثال DTO با استفاده از Record:public record FavoriteCoffeeDTO(String name, List&lt;String&gt; coffees) {}

String name = favoriteCoffeeDTO.name();منبع: چریک کدرز</description>
                <category>CherikCoders</category>
                <author>محمد صادق شیخ زاهدی</author>
                <pubDate>Tue, 07 May 2024 10:16:46 +0330</pubDate>
            </item>
                    <item>
                <title>پروتکل TUS، آپلود Resumable فایل‌ها</title>
                <link>https://virgool.io/CherikCoders/%D9%BE%D8%B1%D9%88%D8%AA%DA%A9%D9%84-tus-%D8%A2%D9%BE%D9%84%D9%88%D8%AF-resumable-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7-vbzo8mpovqqm</link>
                <description>سلام :) توی این مقاله یک توضیح مختصر به همراه مثال براتون آماده کردم و در مقالات بعد اطلاعات کامل و سورس کدها را خدمتتان قرار می دمپروتکل tusخب بریم سراغ پروتکل tus, یک پروتکل متن باز برای انتقال فایل ها در بستر اینترنت طراحی شده است که قابلیت انتقال بخش به بخش داده ها یا همون chunk کردن فایل را فراهم میکند پس کل فایل به صورت یکجا ارسال نمی شود و به صورت قطعات کوچیک تر به سمت سرور ارسال می شوند که خب قابلیت های فراوانی را برای ما به ارمغان می آورد :) مثل قابلیت توقف و ادامه آپلود، از سر گیری آپلود بعد از قطع شدن ارتباط کلاینت و سرور، ارسال فایل های حجیم بدون نگرانی در اختلال اینترنت.پروتکل tus یک پروتکل استاندارد برای ارسال فایل بین کلاینت و سرور است که بر پایه ی HTTPS/HTTP است و برای پلتفرم‌های مختلف مانند مرورگرها و اپلیکیشن‌های دسکتاپ و موبایل طراحی و توسعه داده شده است.روند کلی کار tus به شکل زیر است:ایجاد یک آپلود جدید: کلاینت باید یک درخواست POST به آدرس سرور Tus بفرستد تا یک آپلود جدید را آغاز کند. سرور یک شناسه یکتا مثلا یک uuid تولید و به عنوان محل ذخیره سازی فایل در هدری به نام Location قرار میدهد و  پاسخ با کد وضعیت 201 Created به کلاینت ارسال میکند.ارسال قطعات فایل: کلاینت باید قطعات فایل را به سرور ارسال کند. این ارسال قطعه به قطعه انجام می شود و از متد PATCH برای انتقال قطعه استفاده می شود. هر قطعه باید با شناسه آپلود و موقعیت قطعه مشخص شده در هدر Upload-Offset فرستاده شود. سرور باید قطعه را در مکان مناسب ذخیره کند و اندازه و موقعیت قطعه(Upload-Offset) را در پاسخ به کلاینت برگرداند.تکمیل آپلود: هنگامی که کلاینت تمام قطعات فایل را ارسال کرد، باید یک درخواست PATCH اضافی را با موقعیت Upload-Offset برابر با اندازه کل فایل ارسال کند. سرور باید آپلود را تکمیل کند و فایل را در مکان نهایی ذخیره کند.در نهایت، باید توجه داشته باشید که هر نوع آپلود در پروتکل Tus یک شناسه منحصر به فرد دارد. این شناسه برای ادامه آپلود، متوقف کردن آپلود یا بازیابی وضعیت آپلود استفاده می شود. هرچند در این بین فرایند ها و موارد بیشتر از چیزی که در این مقاله مطرح شد وجود دارد که در مقالات بعد بیستر به آن ها خواهیم پرداخت.با استفاده از این مراحل، می توانید با موفقیت فایل ها را با استفاده از پروتکل Tus آپلود کنید.</description>
                <category>CherikCoders</category>
                <author>محمد صادق شیخ زاهدی</author>
                <pubDate>Mon, 04 Dec 2023 20:51:23 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش مقدمات AOP در Spring</title>
                <link>https://virgool.io/CherikCoders/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA-aop-%D8%AF%D8%B1-spring-vp3k0chmui2z</link>
                <description>AOP در Springبرنامه نویسی جنبه گرا (AOP) ،AOP مخفف عبارت &quot;Aspect Oriented Programming&quot; است که به شیوه ای از برنامه نویسی اشاره دارد که در آن برنامه نویسی به صورت کلی تر و ابسترکت تر انجام می شود و به محصول نهایی قابل توجیه است.در AOP، به جای تکرار کد برای قابلیت هایی مانند لاگ کردن، پیدا کردن خطا و تراکنشات، از بلوک هایی که به عنوان &quot;مشاهده کننده ها&quot; (aspects) شناخته می شوند، استفاده می شود. این aspects مستقل از کد اصلی برنامه هستند و وظیفه آنها مدیریت قابلیت های مشترک در برنامه است.به عنوان مثال، فرض کنید که در برنامه شما برای انجام تراکنشات باید هر بار کدی را تکرار کنید که برای شروع و پایان یک تراکنش مورد استفاده قرار می گیرد. با استفاده از AOP، شما می توانید این کد را در یک aspect ذخیره کنید و هربار که برای تراکنشات نیاز دارید، از آن استفاده کنید.برای استفاده از AOP در Spring، می توانید از ابزارهایی مانند AspectJ و Spring AOP استفاده کنید. با استفاده از این ابزارها، می توانید کد خود را برای اجرای عملیات هایی logging، error checking، caching و… استفاده کنید.به طور خلاصه، AOP یک روش برنامه نویسی است که به شما این امکان را می دهد که از بلوک هایی که قابلیت های مشترک را برای کد شما فراهم می آورند، استفاده کنید و در نتیجه کدتان را بهبود بخشید.در Spring برای تعریف Aspect می توانید از انوتیشن های Spring استفاده کنید.فرض کنید که ما یک سیستم ساده احراز هویت کاربران داریم. به طور خاص، ما یک سرویس ورود (LoginService) داریم که دو متد دارد: login و logout. حال ما می خواهیم قبل و بعد از اجرای هر دو متد، لاگ هایی را بنویسیم تا بفهمیم چه کاری در هنگام ورود و خروج از سیستم انجام شده است. این می تواند با استفاده از AOP انجام شود.برای شروع، ما باید یک Aspect تعریف کنیم. Aspect ها در واقع قوانینی هستند که به منظور توصیف رفتاری که قرار است در قالب Advice (نظیر قرار دادن لاگ ها) در نقاط مختلف برنامه اجرا شود، تعریف می شوند.در اینجا ما یک Aspect ساده با نام LoggingAspect ایجاد می کنیم:@Aspe
@Componen
public class LoggingAspect {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Before(&amp;quotexecution(* com.example.demo.service.LoginService.*(..))&amp;quot)
    public void logBefore() {
        logger.info(&amp;quotBefore method execution&amp;quot);
    }

    @After(&amp;quotexecution(* com.example.demo.service.LoginService.*(..))&amp;quot)
    public void logAfter() {
        logger.info(&amp;quotAfter method execution&amp;quot);
    }
}در اینجا، ما یک Aspect به نام LoggingAspect تعریف کرده ایم که دارای دو Advice است: logBefore و logAfter. Advice ها در واقع رفتارهایی هستند که در نقاط مختلف برنامه قابل اجرا هستند. در اینجا، Advice های ما قبل و بعد از اجرای متد های login و logout سرویس ورود را شامل می شوند.همانطور که می بینید، ما از انوتیشن هایی مانند @Aspect و @Before و @After برای تعریف Aspect و Advice استفاده کرده ایم.همچنین با استفاده از عبارتexecution(* com.example.demo.service.LoginService.*(..))به Spring می گوییم که می خواهیم این Aspect و Advice ها را برای همه متهای LoginService اجرا شونددر این کلاس از @Aspect استفاده شده است که نشان می دهد که این کلاس یک Aspect است. همچنین از @Component نیز برای تشخیص این که این کلاس یک کامپوننت Spring استفاده شده است.همچنین در این کلاس، متدهای logBefore() و logAfter() به عنوان Advice های قبل از اجرای یک متد (Before advice) و بعد از اجرای یک متد (After advice) تعریف شده اند.توی این مطلب یک توضیح مختصر و یک مثال ساده زدیم در مطالب بعد بیشتر به این موضوع می پردازیم :)</description>
                <category>CherikCoders</category>
                <author>محمد صادق شیخ زاهدی</author>
                <pubDate>Sat, 25 Feb 2023 12:08:38 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت docker-compose برای پروژه SpringBoot و MongoDB</title>
                <link>https://virgool.io/CherikCoders/%D8%B3%D8%A7%D8%AE%D8%AA-docker-compose-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87-springboot-%D9%88-mongodb-csdvdmzxhrb7</link>
                <description>خب برای شروع یک فایل به اسم docker-compose.yml در فولدر پروژه ایجاد میکنیمversion: &amp;quot3.8
	services:
	  mongo:
	    image: mongo:4.4
	    container_name: mongo
	    hostname: mongo&amp;quotیک سرویس ایجاد کردیم به نام mongo که از ایمیج mongo:4.4 استفاده میکنه میتونیم از ایمیج با هر تگ دیگه ای استفاده کنیم از لینک زیر سایر تگ های mongodb را ببینید https://hub.docker.com/_/mongo/tags بعد از مشخص کردن ایمیج یک اسم برای کانتینرمون انتخاب میکنیم و هاست نیم ست کردیمversion: &amp;quot3.8&amp;quot
	services:
	  mongo:
	    image: mongo:4.4
	    container_name: mongo
	    hostname: mongo
	    ports:
	      - &amp;quot27017:27017&amp;quot
	    environment:
	      - MONGO_INITDB_ROOT_USERNAME=root
	      - MONGO_INITDB_ROOT_PASSWORD=root
	      - MONGO_INITDB_DATABASE=mydb
        networks:
	      - mongo-network

networks
	  mongo-network:
	      name: mongo-networkدر ادامه پورت mongo رو به یکی از پرت های سیستم مپ کردیم و ورودی های خودمون که environment ها هستن مشخص کردیمهمچنین یک شبکه جدید ایجاد کردیم به اسم mongo-network :)برای ذخیزه ی دیتاهامون نیاز هستش که volumes را ست کنیم:version: &amp;quot3.8&amp;quot
	services:
	  mongo:
	    image: mongo:4.4
	    container_name: mongo
	    hostname: mongo
	    ports:
	      - &amp;quot27017:27017&amp;quot
	    environment:
	      - MONGO_INITDB_ROOT_USERNAME=root
	      - MONGO_INITDB_ROOT_PASSWORD=root
	      - MONGO_INITDB_DATABASE=mydb
        volumes:
	      - ./mongo/data/db/:/data/db/
	      - ./mongo/log/mongodb/:/var/log/mongodb/
	      - ./mongo/initdb.d/:/initdb.d/
        networks:
	      - mongo-network

networks
	  mongo-network:
	      name: mongo-networkسه فولدر در مسیر جاری پروژه ایجاد میکنیم به شکل زیرmkdir ./mongo/data
mkdir ./mongo/log
mkdir ./mongo/initdb.dخب کارمون تقریبا با mongo تموم شد فقط یک بخش باقی مونده که یک یوزر بسازیم تا از اون در SpringBoot استفاده کنیمبرای اینکار نیازه هست یک shell اسکریپت مینویسیم به اسم create-user.sh و در فولدر initdb.d قرار میدهیم تا در زمان ساخت کانتینر اجرا شود#!/bin/bash
mongo -u &amp;quotroot&amp;quot -p &amp;quotroot&amp;quot --authenticationDatabase &amp;quotadmin&amp;quot &amp;quotmydb&amp;quot --eval &amp;quotdb.createUser({ user: &#039;user1&#039;, pwd: &#039;user1&#039;, roles: [{ role: &#039;dbOwner&#039;, db: &#039;mydb&#039; }] })&amp;quotاسکریپت بالا یک کاربر با نام کاربری و رمز user1 که دسترسی کامل به بانک اطلاعاتی mydb دارد ایجاد میکنددیگ بریم سراغ اسپرینگ :)قبل هرچیز نیازه یک داکر فایل برای پروژه ایجاد کنیم،برای اینکار یک فایل به نام Dockerfile ایجاد میکنیم نمونه زیر ساده ترین حالت ممکن هستشFROM openjdk:17.0.1-jdk-slim

COPY target/*.jar  app.jar
EXPOSE 8080
ENTRYPOINT [&amp;quotjava&amp;quot,&amp;quot-jar&amp;quot,&amp;quotapp.jar&amp;quot]توی این مثال چون ورژن جاوا من 17 بود از ایمیج openjdk:17.0.1-jdk-slim استفاده کردماین داکر فایل jar فایل موجود در فولدر target را داخل کانتینر ما کپی میکند و بعد اونو اجرا میکنهاما مشکلی که داره اینه که نیازه که پروژه از قبل build شده باشدمیتونیم داکر فایلمونو به شکل زیر تغییر بدیم تا خودش package برامون بسازهFROM maven:3.8.3-openjdk-17 AS builder
ADD . /app
WORKDIR /app
RUN mvn -f /app/pom.xml clean package
FROM openjdk:17.0.1-jdk-slim
	
COPY --from=builder /app/target/*.jar  app.jar	
EXPOSE 8080	
ENTRYPOINT [&amp;quotjava&amp;quot,&amp;quot-jar&amp;quot,&amp;quotapp.jar&amp;quot]حال فایل docker-compose.yml ویرایش میکنیم و یک سرویس جدید بهش اضافه میکینمversion: &amp;quot3.8&amp;quot
services:
  mongo:
    image: mongo:4.4
    ...

  web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: app
    restart: always
    depends_on:
      - mongo
    ports:
      - &amp;quot8080:8080&amp;quot
    environment:
      - SERVER_PORT=8080
      - SPRING_PROFILES_ACTIVE=prod
      - SPRING_APPLICATION_NAME=myapp
      - SPRING_DATA_MONGODB_AUTHENTICATION_DATABASE=admin
      - SPRING_DATA_MONGODB_AUTO_INDEX_CREATION=true
      - SPRING_DATA_MONGODB_HOST=mongo
      - SPRING_DATA_MONGODB_PORT=27017
      - SPRING_DATA_MONGODB_USERNAME=user1
      - SPRING_DATA_MONGODB_PASSWORD=user1
      - SPRING_DATA_MONGODB_DATABASE=mydb
    networks:
      - mongo-network

networks:
  mongo-network:
      name: mongo-networkنیازه که environmentهارو بر اساس پروژه خودمون تنظیم کنیم :) https://gist.github.com/sheikhoo/dbaaf0342fe121ea5f0b1d45515e9fd5 کارمون دیگ تمومه کافیه دستور زیر رو اجرا کنیم تا پروژه و mongo روی داکر راه اندازی بشنdocker-compose upهمین :)</description>
                <category>CherikCoders</category>
                <author>محمد صادق شیخ زاهدی</author>
                <pubDate>Sat, 25 Feb 2023 07:54:00 +0330</pubDate>
            </item>
                    <item>
                <title>RabbitMQ چیست؟ استفاده از RabbitMQ در Spring Boot</title>
                <link>https://virgool.io/CherikCoders/rabbitmq-%DA%86%DB%8C%D8%B3%D8%AA-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-rabbitmq-%D8%AF%D8%B1-spring-boot-oeba0v1jpkry</link>
                <description>قبل هرچیز یک نگاه به RabbitMQ بندازیم :)خب RabbitMQ یک نرم افزار رایج انتقال پیام(messaging broker) بین برنامه ها و سیستم هاست که به آن ها اجازه می دهد به یکدیگر متصل شوند و ارتباط برقرار کنند. این یک روش رایج برای سرویس ها در سیستم های مبتنی بر میکروسرویس(microservices-based systems) است که به‌صورت نامتقارن از طریق ارسال پیام و عملیات صف بندی ارتباط برقرار کنند.برای اینکه بیشتر درمورد RabbitMQ بدونید و نحوه ی کار اون آشنا بشید یه سر به این مقاله برنید https://virgool.io/@mabdi/rabbitmq-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%DA%86%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%DB%8C-%D8%AF%D8%A7%D8%B1%D8%AF-lkdktial4v3g یه توضیح کوچیک در باره نحوه ی کار RabbitMQ اینجا بهتون میدم، بعد میریم سراغ Spring Bootپیام رسانی در RabbitMQ شامل موارد زیر است:producer یک برنامه کاربری است که پیام ها را به RabbitMQ ارسال می کند. پیام ها مستقیماً به یک صف(queue) ارسال نمی شوند.در اینجا، producer پیام را به یک exchange ارسال می کند. exchange مسئولیت مسیریابی پیام به صف های(queues) مختلف را بر عهده دارندبه زبان ساده producer برنامه ای است که پیام های اولیه را تولید میکنه و به RabbitMQ ارسال می کند پیام ها ابتدا در exchange مشخص میشود که وارد کدام صف شوندصف(queue) یک بافر است که در داخل RabbitMQ قرار دارد تا پیام هایی را که تولیدکننده می فرستد و گیرنده دریافت می کند ذخیره کند.consumer یک برنامه کاربردی کاربر است که پیام ها را از RabbitMQ دریافت می کند و سپس آنها را پردازش می کند.در تصویر زیر این فرایند را مشاهده می کنیدنصب RabbitMQحالا که با RabbitMQ آشنا شدیم وقتشه تا اونو نصب کنیم، البته من برای نصب و استفاده از داکر استفاده میکنم پیشنهاد می کنم شماهم بجای نصب خود نرم افزار از کانتینرهای داکر استفاده کنید.کار سختی نیست کافیه داکر روی سیستم نصب داشته باشید و دستور زیر را در cmd یا terminal اجرا کنیدdocker run -d --name my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.9-managementحالا اگر داخل مرورگر http://localhost:15672 بزنید محیط مدیریت RabbitMQ براتون باز میشه و میتونید با یوزر guest و پسورد guest وارد شوید. هرچند ما با این محیط فعلا کاری نداریم اما میتونید مفاهیمی که بالا گفتیم اینجا مشاهده کنید.سورس پروژهپروژه ای که در ادامه قراره توضیح بدیمو میتونید از لینک زیر دریافت کنید :)  https://github.com/sheikhoo/RabbitMQ-SpringBoot-Example آماده سازیایجاد پروژه و Dependenciesوقتشه بریم سراغ SpringBoot یک پروژه جدید ایجاد کنید، برای استفاده از RabbitMQ نیاز هستش تا کتابخانه spring-boot-starter-amqp را به پروژه خودمون اضافه کنیم. برای اینکار کد زیر را در فایل pom.xml قرار دهید&lt;dependency&gt;
      &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
      &lt;artifactId&gt;spring-boot-starter-amqp&lt;/artifactId&gt;
&lt;/dependency&gt;ایجاد Modelیک کلاس POJO که میخواهیم اشیاء آن را به عنوان پیام مبادله (ارسال/دریافت) کنیم ایجاد میکنیم. در اینجا من اسم کلاسمو Message میزارم شما میتونید هر مدلی که دوست دارید بسازید مثلا User، Student، Log یا هرچیز دیگه ایpackage ir.sheikhoo.rabbitmqspringboot.model;
public class Message {
    private String title;
    private String text;
    private String sender;
    // ... getter و setter هارو اینجا قرار بدید
}application.propertiesفایل پیکربندی(application.properties) باید به شکل زیر باشد:server.port= 8080
spring.rabbitmq.host= localhost
spring.rabbitmq.port= 5672
spring.rabbitmq.username= guest
spring.rabbitmq.password= guest
queue.name= example_queue
fanout.exchange= example_exchangeخط اول port که قراره برنامه ما روی اون اجرا بشه رو مشخص کردیم، 4 خط بعد هم اطلاعات RabbitMQ را برای اتصال به اونو به برناممون دادیم.خط 5 یک اسم برای صف یا همون queue انتخاب کردیم که ما در اینجا اسمشو example_queue گذاشتیم و خط 6 هم یک اسم برای exchange انتخاب کردیم که اینجا ما اونو example_exchange گذاشتیم.تنظیمات RabbitMQیک کلاس جاوا جدید برای RabbitMQ configuration به نام RabbitConfiguration.java ایجاد می کنیمنکته: انوتیشن @Configuration در بالا کلاس فراموش نکنیدpackage ir.sheikhoo.rabbitmqspringboot.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfiguration {
    @Value(&amp;quot${fanout.exchange}&amp;quot)
    private String fanoutExchange;

    @Value(&amp;quot${queue.name}&amp;quot)
    private String queueName;

    @Bean
    Queue queue() {
        return new Queue(queueName, true);
    }

    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange(fanoutExchange);
    }

    @Bean
    Binding binding(Queue queue, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(queue).to(fanoutExchange);
    }
}بیایید نگاهی دقیق به این کلاس پیکربندی بیندازیم:انوتیشن @Value حاوی نام queue و exchange است که از application.properties می خواند.تابع queue() جهت ایجاد یک صف جدید برای ذخیره Messageهای ما بکار میرود.تابع fanoutExchange() جهت ایجاد یک exchange جدید از نوع FanoutExchange استفاده می شود. FanoutExchange فقط تمام پیام هایی را که دریافت می کند به تمام صف هایی که می شناسد پخش می کند.تابع binding() صف و exchange را به هم متصل می کند.ساخت Producerخب Producer که یادتون هست بالا درموردش صحبت کردیم، حال میخواهیم یک Producer  برای ارسال پیام های از جنس Message به صف RabbitMQ ایجاد کنیم اسم این کلاس را QueueProducer قرار می دهیمما از درون producer و consumer استفاده میکنیم که ارائه شده توسط چارچوب Spring Boot است.package ir.sheikhoo.rabbitmqspringboot.config;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import ir.sheikhoo.rabbitmqspringboot.model.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class QueueProducer {
    @Value(&amp;quot${fanout.exchange}&amp;quot)
    private String fanoutExchange;

    private final RabbitTemplate rabbitTemplate;
    @Autowired
    public QueueProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }
    public void produce(Message message) throws JsonProcessingException {
        rabbitTemplate.setExchange(fanoutExchange);
        rabbitTemplate.convertAndSend(new ObjectMapper().writeValueAsString(message));
    }
}تابع convertAndSend() با استفاده از ObjectMapper مدل ما را به JSON تبدیل میکند تا بتوان درون صف آن را ذخیره نماییم.ساخت Consumerبرای دریافت پیام ها() از صف به Consumer نیاز داریم اسم این کلاس QueueConsumer میزاریمpackage ir.sheikhoo.rabbitmqspringboot.config;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import ir.sheikhoo.rabbitmqspringboot.model.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class QueueConsumer {
    private final RabbitTemplate rabbitTemplate;

    @Value(&amp;quot${queue.name}&amp;quot)
    private String queueName;

    @Autowired
    public QueueConsumer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }
    private String receiveMessage() {
        String message = (String) rabbitTemplate.receiveAndConvert(queueName);
        return message;
    }

    public Message processMessage() throws JsonProcessingException {
        String message = receiveMessage();
        return new ObjectMapper().readValue(message, Message.class);
    }
}ساخت کنترلربا ساخت یک controller و قرار دادن همه بخش های کنار هم میتوانیم از برنامه که نوشتیم استفاده کنیمpackage ir.sheikhoo.rabbitmqspringboot.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import ir.sheikhoo.rabbitmqspringboot.config.QueueConsumer;
import ir.sheikhoo.rabbitmqspringboot.config.QueueProducer;
import ir.sheikhoo.rabbitmqspringboot.model.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping(&amp;quot/&amp;quot)
public class LogsController {

    @Autowired
    private QueueProducer queueProducer;
    @Autowired
    private QueueConsumer queueConsumer;

    @GetMapping(&amp;quotgetMessage&amp;quot)
    public ResponseEntity&lt;?&gt; getMessage() throws JsonProcessingException {
        Message message = queueConsumer.processMessage();
        return new ResponseEntity&lt;Message&gt;(message, HttpStatus.OK);
    }

    @PostMapping(&amp;quotsendMessage&amp;quot)
    public ResponseEntity&lt;?&gt; sendMessage(@RequestBody Message message) throws
JsonProcessingException {
        queueProducer.produce(message);
        return new ResponseEntity&lt;Message&gt;(HttpStatus.CREATED);
    }
}بعد از اجرا پروژه با استفاده از postman میتوانید درخواست POST و GET پیام ها را به صف ارسال نمایید یا از صف استخراج کنیدارسال و قرار دادن پیام به صف:[POST] http://localhost:8080/sendMessageBody:{ 
     &amp;quottitle&amp;quot:&amp;quotHello,RabbitMQ&amp;quot, 
     &amp;quottext&amp;quot:&amp;quotThis is my message&amp;quot,
     &amp;quotsender&amp;quot:&amp;quotadmin&amp;quot 
} دریافت پیام از صف:[GET] http://localhost:8080/getMessage</description>
                <category>CherikCoders</category>
                <author>محمد صادق شیخ زاهدی</author>
                <pubDate>Mon, 02 Jan 2023 22:30:17 +0330</pubDate>
            </item>
            </channel>
</rss>