Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将Soap消息发送到activemq队列?_Java_Web Services_Soap_Jms_Soap Client - Fatal编程技术网

Java 如何将Soap消息发送到activemq队列?

Java 如何将Soap消息发送到activemq队列?,java,web-services,soap,jms,soap-client,Java,Web Services,Soap,Jms,Soap Client,我正在从事一个向第三方Web服务发送soap请求的项目,我是java开发的新手。到目前为止,我有一个创建soap消息、发送消息然后接收响应的基本代码;该消息包含一个xml文件作为base64字符串文件 我正在使用的代码正在工作,但我需要确保soap请求能够在更短的时间内成功传递消息(我有48小时的时间来保证传递),因此如果出现某种网络故障或Web服务不可用,我的代码将产生错误并停止程序的其余部分 // Create SOAP Connection SOAPConnectionFa

我正在从事一个向第三方Web服务发送soap请求的项目,我是java开发的新手。到目前为止,我有一个创建soap消息、发送消息然后接收响应的基本代码;该消息包含一个xml文件作为base64字符串文件

我正在使用的代码正在工作,但我需要确保soap请求能够在更短的时间内成功传递消息(我有48小时的时间来保证传递),因此如果出现某种网络故障或Web服务不可用,我的代码将产生错误并停止程序的其余部分

// Create SOAP Connection
        SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
        SOAPConnection soapConnection = soapConnectionFactory.createConnection();

        // Send SOAP Message to SOAP Server
        String url = "https://facturaelectronica.dian.gov.co/habilitacion/B2BIntegrationEngine/FacturaElectronica";
        SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);

        // print SOAP Response
        System.out.print("Response SOAP Message:");
        soapResponse.writeTo(System.out);


        soapConnection.close();
我已经读过,可以将soap请求发送到jms QUE,这样我就可以确保整个程序在网络出现故障的情况下都能正确执行,但是,据我所知,我需要将soap消息转换为jms消息,我还没有弄明白这一点。我发现supposly可以用它来实现转换:

 //Convert SOAP to JMS message.
    Message m = MessageTransformer.SOAPMessageIntoJMSMessage                                                    (soapMessage,session);
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.Name;

import java.net.URL;
import javax.activation.DataHandler;

import com.sun.messaging.Queue;
import com.sun.messaging.xml.MessageTransformer;

import javax.jms.ConnectionFactory;
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.MessageProducer;

/**
 * This example shows how to use the MessageTransformer utility to send SOAP
 * messages with JMS.
 * <p>
 * SOAP messages are constructed with javax.xml.soap API.  The messages
 * are converted with MessageTransformer utility to convert SOAP to JMS
 * message types.  The JMS messages are then published to the JMS topics.
 */
public class ToJms {

    ConnectionFactory        connectionFactory = null;
    Connection               connection = null;
    Session                  session = null;
    Topic                    topic = null;
    Queue                    queue = null;

    MessageProducer          msgProducer = null;
    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;


    /**
     * default constructor.
     */
    public ToJms(String QueueName) {
        init(QueueName);
    }

    /**
     * Initialize JMS Connection/Session/Topic and Producer.
     */
    public void init(String topicName) {
        try {
//            connectionFactory = new com.sun.messaging.ConnectionFactory();
//            connection = connectionFactory.createConnection(localhost:6161);
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
            Connection connection = connectionFactory.createConnection();
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

            topic = session.createTopic(topicName);
            msgProducer = session.createProducer(topic);
        } catch (JMSException jmse) {
            jmse.printStackTrace();
        }
    }

    /**
     * Send SOAP message with JMS API.
     */
    public void send (SOAPMessage soapMessage) throws Exception {

                /**
         * Convert SOAP to JMS message.
         */
        Message message = MessageTransformer.SOAPMessageIntoJMSMessage( soapMessage, session );

        /**
         * publish JMS message.
         */
        msgProducer.send( message );
    }

    /**
     * close JMS connection.
     */
    public void close() throws JMSException {
        connection.close();
    }

    /**
     * The main program to send SOAP messages with JMS.
     */
    public static void main (String[] args) {

        String topicName = "TestTopic";

        if (args.length > 0) {
            topicName = args[0];
        }
        try {
            ToJms ssm = new ToJms(topicName);
           // ssm.send();
            ssm.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
基于此文档:

因此,我创建了一个类来调用ToJms进行转换:

 //Convert SOAP to JMS message.
    Message m = MessageTransformer.SOAPMessageIntoJMSMessage                                                    (soapMessage,session);
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.Name;

import java.net.URL;
import javax.activation.DataHandler;

import com.sun.messaging.Queue;
import com.sun.messaging.xml.MessageTransformer;

import javax.jms.ConnectionFactory;
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.MessageProducer;

/**
 * This example shows how to use the MessageTransformer utility to send SOAP
 * messages with JMS.
 * <p>
 * SOAP messages are constructed with javax.xml.soap API.  The messages
 * are converted with MessageTransformer utility to convert SOAP to JMS
 * message types.  The JMS messages are then published to the JMS topics.
 */
public class ToJms {

    ConnectionFactory        connectionFactory = null;
    Connection               connection = null;
    Session                  session = null;
    Topic                    topic = null;
    Queue                    queue = null;

    MessageProducer          msgProducer = null;
    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;


    /**
     * default constructor.
     */
    public ToJms(String QueueName) {
        init(QueueName);
    }

    /**
     * Initialize JMS Connection/Session/Topic and Producer.
     */
    public void init(String topicName) {
        try {
//            connectionFactory = new com.sun.messaging.ConnectionFactory();
//            connection = connectionFactory.createConnection(localhost:6161);
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
            Connection connection = connectionFactory.createConnection();
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

            topic = session.createTopic(topicName);
            msgProducer = session.createProducer(topic);
        } catch (JMSException jmse) {
            jmse.printStackTrace();
        }
    }

    /**
     * Send SOAP message with JMS API.
     */
    public void send (SOAPMessage soapMessage) throws Exception {

                /**
         * Convert SOAP to JMS message.
         */
        Message message = MessageTransformer.SOAPMessageIntoJMSMessage( soapMessage, session );

        /**
         * publish JMS message.
         */
        msgProducer.send( message );
    }

    /**
     * close JMS connection.
     */
    public void close() throws JMSException {
        connection.close();
    }

    /**
     * The main program to send SOAP messages with JMS.
     */
    public static void main (String[] args) {

        String topicName = "TestTopic";

        if (args.length > 0) {
            topicName = args[0];
        }
        try {
            ToJms ssm = new ToJms(topicName);
           // ssm.send();
            ssm.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
我得到了下一个错误:

线程“main”java.lang.ClassFormatError中出现异常:缺少代码 类文件中非本机或抽象的方法中的属性 javax/xml/messaging/JAXMException位于 java.lang.ClassLoader.defineClass1(本机方法)位于 java.lang.ClassLoader.defineClass(ClassLoader.java:763)位于 security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 位于java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 访问$100(URLClassLoader.java:73) java.net.URLClassLoader$1.run(URLClassLoader.java:368)位于 java.net.URLClassLoader$1.run(URLClassLoader.java:362)位于 java.security.AccessController.doPrivileged(本机方法)位于 java.net.URLClassLoader.findClass(URLClassLoader.java:361)位于 loadClass(ClassLoader.java:424)位于 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)位于 loadClass(ClassLoader.java:357)位于 xml.SoapTest.main(SoapTest.java:42)处的xml.ToJms.send(ToJms.java:111) 在xml.xml.main(xml.java:317)处 com.summan.datavarprinter.Main.Main(Main.java:181)

我在寻找oracle指定的库时遇到了很多麻烦,因为在goolge上有很多不同的结果,我必须尝试很多,直到导入成功

所以我想知道这里是否有人知道如何实现这一点,或者是否有更好的解决方案将soap消息发送到activemq队列


谢谢。

我找不到一种方法来实现这一点,因此我最终要做的是将soap消息转换为字符串,将其发送到activemq,然后在使用时执行相反的过程