간단한 EJB3 메시지 구동 Bean

6587 단어 ejbjmsQueuetopic
Jms 사양의 두 가지 메시지 전송 방식인 Topic 및 Queue는 다음 표()와 비교됩니다.
 
Topic
Queue
개요
Publish Subscribe 메시지 게시 구독 메시지
Point-to-Point 점 대 점
유무상태
topic 데이터는 기본적으로 땅에 떨어지지 않고 무상태입니다.
Queue 데이터는 기본적으로 mq 서버에 파일 형식으로 저장됩니다. 예를 들어Active MQ는 $AMQ 에 저장됩니다.HOME\data\kr-store\data 아래DB 스토리지로 구성할 수도 있습니다.
무결성 보장
publisher가 발표한 모든 데이터를 Subscriber가 받아들일 수 있다는 보장은 없습니다.
Queue는 모든 데이터를 Receiver에서 수신할 수 있도록 보장합니다.
메시지 손실 여부
일반적으로publisher가 어떤 topic에 메시지를 발표할 때 이 topic 주소를 감청하고 있는sub만 메시지를 받을 수 있다.만약 Sub가 감청하고 있지 않다면, 이 topic는 잃어버릴 것이다.
Sender는 대상Queue에 메시지를 보내고receiver는 이Queue의 메시지를 비동기적으로 받을 수 있습니다.Queue에 있는 메시지는 리커버리가 가져오지 않으면 잃어버리지 않습니다.
메시지 게시 수신 정책
한 쌍의 많은 메시지가 수신 정책을 발표하고 같은 topic 주소의 여러sub를 감청하면publisher가 보낸 메시지를 받을 수 있습니다.Sub 알림 수신 완료 mq 서버
일대일 메시지 발표 수신 정책, 한sender가 보낸 메시지,receiver만 수신할 수 있습니다.receiver가 수신된 후 mq 서버가 수신했음을 알립니다. mq 서버는queue의 메시지를 삭제하거나 다른 조작을 합니다.
 
 
Queue
 
게시Queue는 jboss 디렉터리에 배치된 기본 서버 jboss-4.2.3입니다.GA\server\default\deploy
파일 이름은 파일 이름 - 서비스여야 합니다.xml 형식
 
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=leamQueue">
<attribute name="JNDIName">queue/leamQueue</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager
</depends>
</mbean>

</server>

 
게시에 성공하면 jboss 웹 제어 페이지/jmx-console/Html Adaptor에서 발표된 이름을 볼 수 있습니다
 
  +- queue (class: org.jnp.interfaces.NamingContext)
  |   +- A (class: org.jboss.mq.SpyQueue)
  |   +- testQueue (class: org.jboss.mq.SpyQueue)
  |   +- ex (class: org.jboss.mq.SpyQueue)
  |   +- leamQueue (class: org.jboss.mq.SpyQueue)

 
새 클래스Queue 메시지 보내기
/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			InitialContext ctx=new InitialContext();
			QueueConnectionFactory factory=
                               (QueueConnectionFactory)ctx.lookup("QueueConnectionFactory");
			QueueConnection conn=factory.createQueueConnection();
			QueueSession session=
                                conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
			Destination destination=(Destination)ctx.lookup("queue/leamQueue");
			MessageProducer prd=session.createProducer(destination);
			prd.send(session.createTextMessage("  leam  queue "));
			session.close();
			conn.close();
			System.out.println(" ");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
 
 
보내는 Queue 메시지 가져오기 설정
jndi.properties 파일 내용
 
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=localhost:1099
 
새 클래스 가져오기Queue 메시지
@MessageDriven(activationConfig = {
		@ActivationConfigProperty(propertyName = "destinationType", 
propertyValue = "javax.jms.Queue"),
		@ActivationConfigProperty(propertyName = "destination", 
propertyValue = "queue/leamQueue") })
public class MessageDriverBean implements MessageListener {

	public void onMessage(Message message) {
		TextMessage txtmsg=(TextMessage)message;
		try {
			System.out.print(txtmsg.getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}

	}

}
 
모든 코드를 다 쓴 후에 jar을 포장하여 jboss 출력에 발표합니다
  leam  queue 
 
 
게시 Topic은 jboss 디렉터리에 배치되어 기본 서버 jboss-4.2.3입니다.GA\server\default\deploy
 
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Topic"
name="jboss.mq.destination:service=Topic,name=leamTopic">
<attribute name="JNDIName">topic/leamTopic</attribute>
<depends
optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager
</depends>
</mbean>
</server>

 
게시에 성공하면 jboss 웹 제어 페이지/jmx-console/Html Adaptor에서 발표된 이름을 볼 수 있습니다
+- topic (class: org.jnp.interfaces.NamingContext)
  |   +- testDurableTopic (class: org.jboss.mq.SpyTopic)
  |   +- testTopic (class: org.jboss.mq.SpyTopic)
  |   +- securedTopic (class: org.jboss.mq.SpyTopic)
  |   +- leamTopic (class: org.jboss.mq.SpyTopic)

 
새 클래스에서 Topic 메시지 보내기
public class TopicSender {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			InitialContext ctx=new InitialContext();
			TopicConnectionFactory factory=
                                 (TopicConnectionFactory)ctx.lookup("TopicConnectionFactory");
			TopicConnection conn=factory.createTopicConnection();
			TopicSession session=
                                conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
			Destination destination=(Destination)ctx.lookup("topic/leamTopic");
			MessageProducer prd=session.createProducer(destination);
			prd.send(session.createTextMessage("  leam  topic "));
			session.close();
			conn.close();
			System.out.println(" ");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 
새 클래스에서 Topic 메시지 가져오기
@MessageDriven(activationConfig = {
		@ActivationConfigProperty(propertyName = "destinationType", 
propertyValue = "javax.jms.Topic"),
		@ActivationConfigProperty(propertyName = "destination",
 propertyValue = "topic/leamTopic") })

public class ReceiveBean implements MessageListener {

	public void onMessage(Message message) {
		TextMessage txtmsg=(TextMessage)message;
		try {
			System.out.print(this.getClass()+txtmsg.getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

}

좋은 웹페이지 즐겨찾기