将XML消息发送到JMS队列

时间:2018-11-21 07:13:01

标签: java servlets jms

我正在一个项目中工作,我试图在其中调用Servlet,该Servlet将使用Java代码将XML消息推送到在本地计算机上运行的JMS队列中。您可以在下面找到实际的Servlet代码,该代码实际上将消息发送到队列。

import java.io.IOException;
import java.io.PrintWriter;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class MessageSender
  extends HttpServlet
{
  private static final long serialVersionUID = 1L;
  static PrintWriter out;
  public static final String CNN_FACTORY = "jms/alert/connectionFactory";
  public static final String QUEUE_NAME = "jms/alert/amlScreenQueue";
  public static String currentQueueName;
  public static String JMSConnectionFactory;
  private QueueConnection qcon;
  private QueueSession qsession;
  private static QueueSender qsender;
  private Queue queue;
  private static ObjectMessage om;
  private static MessageProducer messageProducer;

  public MessageSender() {}

  public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    try
    {
      String JMSQueueName = request.getParameter("JMSQueueName");
      currentQueueName = JMSQueueName;

      JMSConnectionFactory = request.getParameter("JMSConnectionFactory");
      out = response.getWriter();
      InitialContext ic = getInitialContext();
      init(ic, JMSQueueName);
      doPost(request, response);
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void init(Context ctx, String queueName)
    throws NamingException, JMSException
  {
    QueueConnectionFactory qconFactory = (QueueConnectionFactory)ctx.lookup(JMSConnectionFactory);
    this.qcon = qconFactory.createQueueConnection();
    this.qsession = this.qcon.createQueueSession(false, 1);
    queue = ((Queue)ctx.lookup(queueName));

    QueueConnection qcon = qconFactory.createQueueConnection();
    qcon.start();
    QueueSession qsession = qcon.createQueueSession(false, 1);
    qsender = qsession.createSender(queue);
  }


  protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    String textMessage = request.getParameter("textMessage");

    try
    {
      TextMessage msg = qsession.createTextMessage(textMessage);
      msg.setStringProperty("JMSXGroupID", "1");
      msg.setIntProperty("JMSXGroupSeq", 1);
      msg.setBooleanProperty("JMS_IBM_Last_Msg_In_Group", false);
      qsender.send(msg);
      out.println("Message sent to queue " + currentQueueName);
      out.println("");
      out.println(msg.getText());
    }
    catch (JMSException e)
    {
      e.printStackTrace();
      out.println(e.getErrorCode());
      try
      {
        qsender.close();
        qcon.close();
      }
      catch (JMSException e) {
        e.printStackTrace();
      }
    }
    finally
    {
      try
      {
        qsender.close();
        qcon.close();
      }
      catch (JMSException e) {
        e.printStackTrace();
      }
    }
  }

  private static InitialContext getInitialContext() throws NamingException
  {
    return new InitialContext();
  }
}

这是我用来调用servlet的Java代码,

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map.Entry;

public class SendMessage {

    public static void main(String[] args) throws URISyntaxException{
        String line;
        StringBuffer buffer = new StringBuffer();
        String data = null;

        try 
        { 
            String filePath = "data/payload.xml";
            File dataFile = new File(filePath);
            if(dataFile.exists()){

                data = new String(Files.readAllBytes(Paths.get(filePath)));                

            }else{
                System.out.println("Not Available");
            }



            String localUrl = "http://localhost:8080/SimulationTool/MessageSender";
            String params = "JMSQueueName=jms/alert/amlScreenQueue&"
                    + "JMSConnectionFactory=jms/alert/connectionFactory&"
                    + "textMessage=" + data;

            System.out.println("PARAMS:::" + params);

            URL url = new URL(localUrl);

            System.out.println("URL FOUND:::" + url.toURI());

            URLConnection conn = url.openConnection();
            conn.setDoOutput(true);
            conn.connect();

            System.out.println("Response Code:::" + ((HttpURLConnection)conn).getResponseCode());

            BufferedWriter out = new BufferedWriter( new OutputStreamWriter( conn.getOutputStream() ));
            out.write(params);
            out.flush();
            out.close();

            // Response code
            System.out.println("Response Code:::" + ((HttpURLConnection)conn).getResponseCode());

            // Response values
            for (Entry<String, List<String>> header : ((HttpURLConnection)conn).getHeaderFields().entrySet()) {
                System.out.println(header.getKey() + "=" + header.getValue());
            }


            BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream() ) );                
            String response;
            while ( (response = in.readLine()) != null ) {
                System.out.println( response );
            }
            in.close();

        }
        catch ( MalformedURLException ex ) {
            ex.printStackTrace();
        }
        catch ( IOException ex ) {
            ex.printStackTrace();
        } 
    }

}

问题是它失败并出现以下异常,

Response Code:::200
    java.net.ProtocolException: Cannot write output after reading input.
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1312)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1291)
        at servlettests.SendMessage.main(SendMessage.java:63)

它显示响应代码为200,因此连接成功,但是在获取输出流(创建该输出流以将消息发送到队列)时失败。请帮我解决这个问题。

0 个答案:

没有答案