use of org.apache.pulsar.client.api.MessageBuilder in project incubator-pulsar by apache.
the class JavaInstanceRunnableProcessTest method setup.
@BeforeMethod
public void setup() throws Exception {
mockProducers.clear();
mockConsumers.clear();
fnConfig = FunctionConfig.newBuilder().setAutoAck(true).setClassName(TestFunction.class.getName()).addInputs("test-src-topic").setName("test-function").setOutput("test-output-topic").setProcessingGuarantees(ProcessingGuarantees.ATLEAST_ONCE).setTenant("test-tenant").setNamespace("test-namespace").build();
config = new InstanceConfig();
config.setFunctionId("test-function-id");
config.setFunctionVersion("v1");
config.setInstanceId("test-instance-id");
config.setMaxBufferedTuples(1000);
config.setFunctionConfig(fnConfig);
mockClient = mock(PulsarClientImpl.class);
// mock FunctionCacheManager
fnCache = mock(FunctionCacheManager.class);
doNothing().when(fnCache).registerFunctionInstance(anyString(), anyString(), anyList(), anyList());
doNothing().when(fnCache).unregisterFunctionInstance(anyString(), anyString());
ClassLoader clsLoader = JavaInstanceRunnableTest.class.getClassLoader();
when(fnCache.getClassLoader(anyString())).thenReturn(clsLoader);
// mock producer & consumer
when(mockClient.createProducer(anyString(), any(ProducerConfiguration.class))).thenAnswer(invocationOnMock -> {
String topic = invocationOnMock.getArgumentAt(0, String.class);
ProducerConfiguration conf = invocationOnMock.getArgumentAt(1, ProducerConfiguration.class);
String producerName = conf.getProducerName();
Pair<String, String> pair = Pair.of(topic, producerName);
ProducerInstance producerInstance = mockProducers.get(pair);
if (null == producerInstance) {
Producer producer = mock(Producer.class);
LinkedBlockingQueue<Message> msgQueue = new LinkedBlockingQueue<>();
final ProducerInstance instance = new ProducerInstance(producer, msgQueue);
producerInstance = instance;
when(producer.getProducerName()).thenReturn(producerName);
when(producer.getTopic()).thenReturn(topic);
when(producer.sendAsync(any(Message.class))).thenAnswer(invocationOnMock1 -> {
Message msg = invocationOnMock1.getArgumentAt(0, Message.class);
log.info("producer send message {}", msg);
CompletableFuture<MessageId> future = new CompletableFuture<>();
instance.addSendFuture(future);
msgQueue.put(msg);
return future;
});
when(producer.closeAsync()).thenReturn(FutureUtils.Void());
mockProducers.put(pair, producerInstance);
}
return producerInstance.getProducer();
});
when(mockClient.subscribe(anyString(), anyString(), any(ConsumerConfiguration.class))).thenAnswer(invocationOnMock -> {
String topic = invocationOnMock.getArgumentAt(0, String.class);
String subscription = invocationOnMock.getArgumentAt(1, String.class);
ConsumerConfiguration conf = invocationOnMock.getArgumentAt(2, ConsumerConfiguration.class);
Pair<String, String> pair = Pair.of(topic, subscription);
ConsumerInstance consumerInstance = mockConsumers.get(pair);
if (null == consumerInstance) {
Consumer consumer = mock(Consumer.class);
ConsumerInstance instance = new ConsumerInstance(consumer, conf);
consumerInstance = instance;
when(consumer.getTopic()).thenReturn(topic);
when(consumer.getSubscription()).thenReturn(subscription);
when(consumer.acknowledgeAsync(any(Message.class))).thenAnswer(invocationOnMock1 -> {
Message msg = invocationOnMock1.getArgumentAt(0, Message.class);
log.info("Ack message {} : message id = {}", msg, msg.getMessageId());
instance.removeMessage(msg.getMessageId());
return FutureUtils.Void();
});
when(consumer.acknowledgeCumulativeAsync(any(Message.class))).thenAnswer(invocationOnMock1 -> {
Message msg = invocationOnMock1.getArgumentAt(0, Message.class);
log.info("Ack message cumulatively message id = {}", msg, msg.getMessageId());
instance.removeMessagesBefore(msg.getMessageId());
return FutureUtils.Void();
});
when(consumer.closeAsync()).thenAnswer(invocationOnMock1 -> {
mockConsumers.remove(pair, instance);
return FutureUtils.Void();
});
doAnswer(invocationOnMock1 -> {
mockConsumers.remove(pair, instance);
return null;
}).when(consumer).close();
mockConsumers.put(pair, consumerInstance);
}
return consumerInstance.getConsumer();
});
//
// Mock State Store
//
StorageClientBuilder mockBuilder = mock(StorageClientBuilder.class);
when(mockBuilder.withNamespace(anyString())).thenReturn(mockBuilder);
when(mockBuilder.withSettings(any(StorageClientSettings.class))).thenReturn(mockBuilder);
this.mockStorageClient = mock(StorageClient.class);
when(mockBuilder.build()).thenReturn(mockStorageClient);
StorageAdminClient adminClient = mock(StorageAdminClient.class);
when(mockBuilder.buildAdmin()).thenReturn(adminClient);
PowerMockito.mockStatic(StorageClientBuilder.class);
PowerMockito.when(StorageClientBuilder.newBuilder()).thenReturn(mockBuilder);
when(adminClient.getStream(anyString(), anyString())).thenReturn(FutureUtils.value(StreamProperties.newBuilder().build()));
mockTable = mock(Table.class);
when(mockStorageClient.openTable(anyString())).thenReturn(FutureUtils.value(mockTable));
//
// Mock Function Stats
//
mockFunctionStats = spy(new FunctionStats());
PowerMockito.whenNew(FunctionStats.class).withNoArguments().thenReturn(mockFunctionStats);
// Mock message builder
PowerMockito.mockStatic(MessageBuilder.class);
PowerMockito.when(MessageBuilder.create()).thenAnswer(invocationOnMock -> {
Message msg = mock(Message.class);
MessageBuilder builder = mock(MessageBuilder.class);
when(builder.setContent(any(byte[].class))).thenAnswer(invocationOnMock1 -> {
byte[] content = invocationOnMock1.getArgumentAt(0, byte[].class);
when(msg.getData()).thenReturn(content);
return builder;
});
when(builder.setSequenceId(anyLong())).thenAnswer(invocationOnMock1 -> {
long seqId = invocationOnMock1.getArgumentAt(0, long.class);
when(msg.getSequenceId()).thenReturn(seqId);
return builder;
});
when(builder.setProperty(anyString(), anyString())).thenAnswer(invocationOnMock1 -> {
String key = invocationOnMock1.getArgumentAt(0, String.class);
String value = invocationOnMock1.getArgumentAt(1, String.class);
when(msg.getProperty(eq(key))).thenReturn(value);
return builder;
});
when(builder.build()).thenReturn(msg);
return builder;
});
}
use of org.apache.pulsar.client.api.MessageBuilder in project incubator-pulsar by apache.
the class ProducerHandler method onWebSocketText.
@Override
public void onWebSocketText(String message) {
ProducerMessage sendRequest;
byte[] rawPayload = null;
String requestContext = null;
try {
sendRequest = ObjectMapperFactory.getThreadLocal().readValue(message, ProducerMessage.class);
requestContext = sendRequest.context;
rawPayload = Base64.getDecoder().decode(sendRequest.payload);
} catch (IOException e) {
sendAckResponse(new ProducerAck(FailedToDeserializeFromJSON, e.getMessage(), null, null));
return;
} catch (IllegalArgumentException e) {
String msg = format("Invalid Base64 message-payload error=%s", e.getMessage());
sendAckResponse(new ProducerAck(PayloadEncodingError, msg, null, requestContext));
return;
}
final long msgSize = rawPayload.length;
MessageBuilder builder = MessageBuilder.create().setContent(rawPayload);
if (sendRequest.properties != null) {
builder.setProperties(sendRequest.properties);
}
if (sendRequest.key != null) {
builder.setKey(sendRequest.key);
}
if (sendRequest.replicationClusters != null) {
builder.setReplicationClusters(sendRequest.replicationClusters);
}
Message<byte[]> msg = builder.build();
final long now = System.nanoTime();
producer.sendAsync(msg).thenAccept(msgId -> {
updateSentMsgStats(msgSize, TimeUnit.NANOSECONDS.toMicros(System.nanoTime() - now));
if (isConnected()) {
String messageId = Base64.getEncoder().encodeToString(msgId.toByteArray());
sendAckResponse(new ProducerAck(messageId, sendRequest.context));
}
}).exceptionally(exception -> {
numMsgsFailed.increment();
sendAckResponse(new ProducerAck(UnknownError, exception.getMessage(), null, sendRequest.context));
return null;
});
}
Aggregations