2012-03-18 2 views
0

응용 프로그램에 대한 채팅 구성 요소 (모든 토론이 저장되는 곳)를 구축 중이며 클라이언트 컴퓨터와 rabbitmq 서버 간의 인터페이스로 긴 폴링 서버를 계획했습니다. 그러면 형식을 구문 분석하고 (rabbitmq의) 작업 대기열에있는 메시지를 큐에 넣고 celery가 처리하도록합니다. 그런 다음 게시가 허용되는지 여부를 확인하여 db에 대한 정보를 확인하고 db에 메시지를 저장 한 다음 rabbitmq 다시, 이번에는 긴 폴링 서버가 클라이언트 시스템으로 푸시 아웃 할 때 소모됩니다.rabbitmq 채널에서 Java NIO 채널로 전달되는 메시지

토끼 서버에서 긴 폴링 서버로 한 개의 연결을 계획했으며, 많은 수의 채널이 포함되어 있습니다. 각 연결은 클라이언트 컴퓨터가 다른 쪽에서 수신 대기하는 nio 소켓 채널에 해당합니다.

긴 폴링 서버는 Java Nio 라이브러리를 사용하여 작성됩니다. 내 질문에, AMQP 채널에서 소켓 채널로 메시지를 보내는 효율적인 방법은 무엇입니까?

NIO에 대한 이해에서 OP_WRITE에 대한 선택 키를 등록해야하는 유일한 시간은 이전에 시도 된 write() 호출이 0을 반환했을 때입니다.이 경우에도 정보가있을 때 socketchannel에 쓰기에 관심이 있습니다. 해당 AMQP 채널에서 데이터가 해당 amqp 채널에 들어 오면 socketchannel을 통해 클라이언트에 데이터를 보낼 수 있도록 소켓 채널에 어떻게 경고 할 수 있습니까?

답변

1

그냥 write()를 호출하십시오! SocketChannel에 '말할 필요'가 없습니다. 그런 다음 write()가 0을 반환하면 OP_WRITE 작업을 수행하십시오.

+0

그럼 다른 스레드를 사용하여 각각의 해당 소켓 채널에 대한 참조를 포함하는 amqp 채널을 서브 클래스 화하고 쓰기를 작성해야합니까? amqp 채널은 nio 소켓 채널과 다른 객체이기 때문에 : http://www.rabbitmq.com/releases/rabbitmq-java-client/v1.7.0/rabbitmq-java-client-javadoc-1.7.0/com/rabbitmq/ client/impl/ChannelN.html – Jaigus

+0

필자가 읽은 바에 따르면 socketrecv buf에서 무엇인가를 읽은 후에 만 ​​write()를 호출해야한다. 어떻게하면 amqp 채널에서 오는 데이터가있는 경우 select 루프의 소켓 채널에 경고를 보내겠습니까? – Jaigus

+0

이 분명하기 때문에 긴 폴링 서버는 사용자가 다른 쪽 끝에 앉아있는 특정 nio 소켓 채널에 해당하는 각 amqp 채널 개체에서 메시지를 수신하여이 경우 소비자로 작동합니다. select 루프에서 서버는 제작자 역할을하여 사용자가 보낸 메시지를 받아서 제대로 형식을 지정하고 amqp 소켓을 통해 토끼에 대기시킵니다. – Jaigus

관련 문제