101 session.createProducer(queue).send(message);
102
103 //等待回复,回复的消息中包含着服务端返回的SOAP响应。
104
105 String selector = String.format("JMSCorrelationID='%s'", message.getJMSMessageID());
106
107 MessageConsumer consumer = session.createConsumer(message.getJMSReplyTo(), selector);
108
109 TextMessage replyMessage = (TextMessage) consumer.receive();
110
111 //将SOAP响应返回给客户端。
112
113 resp.getWriter().write(replyMessage.getText());
114
115 } catch (Exception e) {
116
117 e.printStackTrace();
118
119 }
120
121 }
122
123 }
接下来需要看一下Listener了。对于每一个Service都有一个Listener与之相对应,当一个Listener从Queue中取得一个消息之后,首先应该判断是否是WSDL请求。如果是WSDL请求,则向WebService发送一个GET请求,并将请求的结果,也就是WSDL封装成一个Message回复给Proxy。如果是SOAP请求,则从中取出SOAP请求部分并通过POST方法发送给Service,所得到的返回结果即为Service的SOAP响应,把它回复给Proxy,进而回复给客户端。
下面是Listener的一个简单实现,在这里我们使用了HttpClient来发送GET和POST请求。
1 public class Listener {
2
3 private ConnectionFactory factory;
4
5 private Connection connection;
6
7 private Queue queue;
8
9 private Session session;
10
11 public Listener() throws Exception {
12
13 //为了简单,还是采用了ActiveMQ。
14
15 factory = new ActiveMQConnectionFactory("vm://localhost");
16
17 connection = factory.createConnection();
18
19 connection.start();
20
21 queue = new ActiveMQQueue("testQueue");
22
23 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
24
25 }
26
27 public void startUp() throws Exception {
28
29 MessageConsumer consumer = session.createConsumer(queue);
30
31 consumer.setMessageListener(new MessageListener() {
32
33 public void onMessage(Message message) {
34
35 try {
36
37 String response;
38
39 //通过判断isWSDL这个属性来判断是否是WSDL请求。
40
41 if (message.getBooleanProperty("isWsdl")) {
42
43 //如果是WSDL请求,则向服务器发送一个GET请求,并等待WSDL响应结果。
44
45 HttpClient client = new HttpClient();
责任编辑:小草