使用JBoss服务器bean在客户端为同步请求/应答JMS使用临时队列

使用JBoss服务器bean在客户端为同步请求/应答JMS使用临时队列,jboss,jms,hornetq,Jboss,Jms,Hornetq,我有一个运行在JBoss7.1上的MDB,还有一个简单的Java应用程序作为另一台机器上的客户机。目标如下: 客户机向服务器发送请求ObjectMessage 服务器处理该请求并再次向客户端ObjectMessage发送响应 我想在客户机上使用临时队列来侦听响应,因为我不知道如何异步执行,而JMSReplyTo消息的属性用于正确回复,因为我应该支持多个独立的客户机 这是客户: public class MessagingService{ private static final String

我有一个运行在JBoss7.1上的MDB,还有一个简单的Java应用程序作为另一台机器上的客户机。目标如下:

客户机向服务器发送请求ObjectMessage 服务器处理该请求并再次向客户端ObjectMessage发送响应 我想在客户机上使用临时队列来侦听响应,因为我不知道如何异步执行,而JMSReplyTo消息的属性用于正确回复,因为我应该支持多个独立的客户机

这是客户:

public class MessagingService{

private static final String JBOSS_HOST = "localhost";
private static final int JBOSS_PORT = 5455;
private static Map connectionParams = new HashMap();

private Window window;

private Queue remoteQueue;
private TemporaryQueue localQueue;

private ConnectionFactory connectionFactory;
private Connection connection;
private Session session;



public MessagingService(Window myWindow){
    this.window = myWindow;
    MessagingService.connectionParams.put(TransportConstants.PORT_PROP_NAME, JBOSS_PORT);
    MessagingService.connectionParams.put(TransportConstants.HOST_PROP_NAME, JBOSS_HOST);
    TransportConfiguration transportConfiguration =  new TransportConfiguration(NettyConnectorFactory.class.getName(), connectionParams);  
    this.connectionFactory = (ConnectionFactory) HornetQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, transportConfiguration);
}


public void sendRequest(ClientRequest request) {
    try {
        connection = connectionFactory.createConnection();

        this.session = connection.createSession(false, QueueSession.AUTO_ACKNOWLEDGE);

        this.remoteQueue = HornetQJMSClient.createQueue("testQueue");
        this.localQueue = session.createTemporaryQueue();

        MessageProducer producer = session.createProducer(remoteQueue);
        MessageConsumer consumer = session.createConsumer(localQueue);

        ObjectMessage message = session.createObjectMessage();
        message.setObject(request);
        message.setJMSReplyTo(localQueue);
        producer.send(message);

        ObjectMessage response = (ObjectMessage) consumer.receive();
        ServerResponse serverResponse = (ServerResponse) response.getObject();
        this.window.dispatchResponse(serverResponse);

        this.session.close();

    } catch (JMSException e) {
        // TODO splittare e differenziare
        e.printStackTrace();
    }
}
现在我在编写服务器端时遇到了问题,因为我无法找到如何建立到临时队列的连接

    public void onMessage(Message message) {
    try {
        if (message instanceof ObjectMessage) {
            Destination replyDestination = message.getJMSReplyTo();
            ObjectMessage objectMessage = (ObjectMessage) message;
            ClientRequest request = (ClientRequest) objectMessage.getObject();

            System.out.println("Queue: I received an ObjectMessage at " + new Date());
            System.out.println("Client Request Details: ");
            System.out.println(request.getDeparture());
            System.out.println(request.getArrival());
            System.out.println(request.getDate());
            System.out.println("Replying...");

                            // no idea what to do here
                            Connection connection = ? ? ? ? ? ? ? ? 

            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer replyProducer = session.createProducer(replyDestination);
            ServerResponse serverResponse = new ServerResponse("TEST RESPONSE");
            ObjectMessage response = session.createObjectMessage();
            response.setObject(serverResponse);
            replyProducer.send(response);

        } else {
            System.out.println("Not a valid message for this Queue MDB");
        }

    } catch (JMSException e) {
        e.printStackTrace();
    }
}

我想不出我遗漏了什么

你问错了问题。。您应该了解如何在任何Bean中创建连接

您需要获取ConnectionFactory,并相应地创建连接

有关更多信息,请查看HornetQ下载中的javaee示例

具体来看javaee/mdb tx send/下载hornetq时

@MessageDriven(name = "MDBMessageSendTxExample",
               activationConfig =
                     {
                        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
                        @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue")
                     })
public class MDBMessageSendTxExample implements MessageListener
{
   @Resource(mappedName = "java:/JmsXA")
   ConnectionFactory connectionFactory;

   public void onMessage(Message message)
   {
     Connection conn = null;
     try
     {

        // your code here...

        //Step 11. we create a JMS connection
        conn = connectionFactory.createConnection();

        //Step 12. We create a JMS session
        Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //Step 13. we create a producer for the reply queue
        MessageProducer producer = sess.createProducer(replyDestination);

        //Step 14. we create a message and send it
        producer.send(sess.createTextMessage("this is a reply"));

     }
     catch (Exception e)
     {
        e.printStackTrace();
     }
     finally
     {
        if(conn != null)
        {
           try
           {
              conn.close();
           }
           catch (JMSException e)
           {
           }
        }
     }
  }