메시지를 게시하여 원격 JMS 를 사용하여 큐 JBoss
-
10-07-2019 - |
문제
이 간단하게 보이지만 나를 찾을 수 없습니 간단한 대답이다.
내가 원하는 연결을 열 원격 JMS 브로커(IP 및 포트를 알려진),열린 세션에는 특정 큐(이름을 알려진)와 메시지를 이 큐가 있습니다.
어떤 간단한 Java API(표준 가능한 경우)해야 할까요?
편집
인 이해하는 것이 지금 JMS 드라이버 사양처럼 JDBC 지의 통신 프로토콜로 나는 생각했다.
주 내에서 실행 JBoss,내가 여전히 이해하지 못하는 방법을 만들기 JBossConnectionFactory.
편집
실제로 했다면 문제가 어떤 생각을(음)면 JMS 될 필요가 처리와 같은 JDBC,다음을 사용할 필요가 클라이언트에 의해 제공됩 내 MQ 구현합니다.때문에 우리가 사용하는 SonicMQ 에 대한 우리의 브로커고,내가 결정 포함 sonic_Client.jar 라이브러리 제공으로 SonicMQ.
이것은 작업에서 독립 Java 응용 프로그램에서 우리의 JBoss 서비스입니다.
도움을 주셔서 감사합니다
해결책
를 사용해야 합니다 JMS,만들기 QueueConnectionFactory
고 거기에서 이동합니다.한 방법을 정확하게 만들기 QueueConnectionFactory
됩 공급업체 관련(JMS 은 기본적으로 드라이버 사양에 대한 메시지 큐로 JDBC 가를 위한 데이터베이스)하지만에 IBM MQ 그것은 무언가 이것을 좋아한다:
MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory();
connectionFactory.setHostName(<hostname>);
connectionFactory.setPort(<port>);
connectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
connectionFactory.setQueueManager(<queue manager>);
connectionFactory.setChannel("SYSTEM.DEF.SVRCONN");
QueueConnection queueConnection = connectionFactory.createQueueConnection();
QueueSession queueSession = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = queueSession.createQueue(<queue name>);
QueueSender queueSender = session.createSender(queue);
QueueReceiver queueReceiver = session.createReceiver(queue);
편집(다음과 같은 질문을 편집)
에 액세스 할 수있는 가장 좋은 방법 원격 큐,또는 큐,그 문제에 대한 추가하는 것입 Queue
인스턴스를 JNDI 레지스트리에 있습니다.원격 큐에서 이를 사용하여 달성 Mbean 는 추가 Queue
인스턴스 때문에 서버가 시작됩니다.
살펴보 http://www.jboss.org/community/wiki/UsingWebSphereMQSeriesWithJBossASPart4, 는 동안 그것은 예 IBM MQ,본질적으로 무엇이 있을 연결하는 모든 원격 큐가 있습니다.
에서 보면 jbossmq-destinations-service.xml
고 org.jboss.mq.server.jmx
당신이 볼 수 Mbean 당신을 만들어야와 관련하여서는 JBoss 큐가 있습니다.
다른 팁
다음은 다음을 사용하여 SonicMQ 브로커에 연결하는 데 사용한 코드입니다. sonic_Client.jar
도서관:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
public class JmsClient
{
public static void main(String[] args) throws JMSException
{
ConnectionFactory factory = new progress.message.jclient.ConnectionFactory("tcp://<host>:<port>", "<user>", "<password>");
Connection connection = factory.createConnection();
try
{
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
try
{
MessageProducer producer = session.createProducer(session.createQueue("<queue>"));
try
{
producer.send(session.createTextMessage("<message body>"));
}
finally
{
producer.close();
}
}
finally
{
session.close();
}
}
finally
{
connection.close();
}
}
}
실제로 저는 JBOSS 4를 사용하고 있으며 JNDI는 사용하기 어렵지 않습니다.
우선 JNDI가 어디에서 실행되는지 알아야합니다.
내 jboss (conf jboss-service.xml)에서 다음과 같습니다.
<mbean code="org.jboss.naming.NamingService" name="jboss:service=Naming" xmbean-dd="resource:xmdesc/NamingService-xmbean.xml">
...
<attribute name="Port">7099</attribute>
...
</mbean>
이것은 중요합니다. 이것은 당신이 연결하려는 포트입니다.
이제이 코드를 사용하여 JNDI에 쉽게 연결할 수 있습니다.
Hashtable<String, String> contextProperties = new Hashtable<String, String>();
contextProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
contextProperties.put(Context.PROVIDER_URL, "jnp://localhost:7099");
InitialContext initContext = new InitialContext(contextProperties);
이제 맥락이 있으면 연결 공장 생성을 제외하고 @Nick Holt의 답변과 매우 유사합니다.
QueueConnectionFactory connFactory = (QueueConnectionFactory) initContext.lookup("ConnectionFactory");
또한 배포 된 경우 큐를 만들 필요가 없습니다.
Queue queue = (Queue) initContext.lookup("queueName");
위의 모든 코드는 JBoss 4.2.2 GA 및 JBOSSMQ로 테스트했습니다 (JBOSSMQ는 제가 정확한 경우 4.2.3으로 JBoss 메시징으로 대체되었습니다).