/*******************************************************************************
* Copyright 2012-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use
* this file except in compliance with the License. A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file.
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
* *****************************************************************************
*
* AWS Tools for Windows (TM) PowerShell (TM)
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
using System.Text;
using Amazon.PowerShell.Common;
using Amazon.Runtime;
using Amazon.SQS;
using Amazon.SQS.Model;
namespace Amazon.PowerShell.Cmdlets.SQS
{
///
/// Delivers a message to the specified queue.
///
///
/// A message can include only XML, JSON, and unformatted text. The following Unicode
/// characters are allowed:
/// #x9
| #xA
| #xD
| #x20
to #xD7FF
/// | #xE000
to #xFFFD
| #x10000
to #x10FFFF
/// Any characters not included in this list will be rejected. For more information, see
/// the W3C specification for characters.
///
///
[Cmdlet("Send", "SQSMessage", SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.Medium)]
[OutputType("Amazon.SQS.Model.SendMessageResponse")]
[AWSCmdlet("Calls the Amazon Simple Queue Service (SQS) SendMessage API operation.", Operation = new[] {"SendMessage"}, SelectReturnType = typeof(Amazon.SQS.Model.SendMessageResponse))]
[AWSCmdletOutput("Amazon.SQS.Model.SendMessageResponse",
"This cmdlet returns an Amazon.SQS.Model.SendMessageResponse object containing multiple properties. The object can also be referenced from properties attached to the cmdlet entry in the $AWSHistory stack."
)]
public partial class SendSQSMessageCmdlet : AmazonSQSClientCmdlet, IExecutor
{
#region Parameter DelayInSeconds
///
///
/// The length of time, in seconds, for which to delay a specific message. Valid values:
/// 0 to 900. Maximum: 15 minutes. Messages with a positive DelaySeconds
/// value become available for processing after the delay period is finished. If you don't
/// specify a value, the default value for the queue applies. When you set FifoQueue
, you can't set DelaySeconds
per message.
/// You can set this parameter only on a queue level.
///
///
[System.Management.Automation.Parameter(Position = 2, ValueFromPipelineByPropertyName = true)]
[Alias("DelaySeconds")]
public System.Int32? DelayInSeconds { get; set; }
#endregion
#region Parameter MessageAttribute
///
///
/// Each message attribute consists of a Name
, Type
, and Value
.
/// For more information, see Amazon
/// SQS message attributes in the Amazon SQS Developer Guide.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
[Alias("MessageAttributes")]
public System.Collections.Hashtable MessageAttribute { get; set; }
#endregion
#region Parameter MessageBody
///
///
/// The message to send. The minimum size is one character. The maximum size is 256 KiB.A message can include only XML, JSON, and unformatted text. The following Unicode
/// characters are allowed:#x9
| #xA
| #xD
| #x20
to #xD7FF
/// | #xE000
to #xFFFD
| #x10000
to #x10FFFF
Any characters not included in this list will be rejected. For more information, see
/// the W3C specification for characters.
///
///
#if !MODULAR
[System.Management.Automation.Parameter(Position = 1, ValueFromPipelineByPropertyName = true)]
#else
[System.Management.Automation.Parameter(Position = 1, ValueFromPipelineByPropertyName = true, Mandatory = true)]
[System.Management.Automation.AllowEmptyString]
[System.Management.Automation.AllowNull]
#endif
[Amazon.PowerShell.Common.AWSRequiredParameter]
public System.String MessageBody { get; set; }
#endregion
#region Parameter MessageDeduplicationId
///
///
/// This parameter applies only to FIFO (first-in-first-out) queues.The token used for deduplication of sent messages. If a message with a particular
/// MessageDeduplicationId
is sent successfully, any messages sent with the
/// same MessageDeduplicationId
are accepted successfully but aren't delivered
/// during the 5-minute deduplication interval. For more information, see
/// Exactly-once processing in the Amazon SQS Developer Guide.- Every message must have a unique
MessageDeduplicationId
,- You may provide a
MessageDeduplicationId
explicitly. - If you aren't able to provide a
MessageDeduplicationId
and you enable
/// ContentBasedDeduplication
for your queue, Amazon SQS uses a SHA-256 hash
/// to generate the MessageDeduplicationId
using the body of the message
/// (but not the attributes of the message). - If you don't provide a
MessageDeduplicationId
and the queue doesn't have
/// ContentBasedDeduplication
set, the action fails with an error. - If the queue has
ContentBasedDeduplication
set, your MessageDeduplicationId
/// overrides the generated one.
- When
ContentBasedDeduplication
is in effect, messages with identical
/// content sent within the deduplication interval are treated as duplicates and only
/// one copy of the message is delivered. - If you send one message with
ContentBasedDeduplication
enabled and then
/// another message with a MessageDeduplicationId
that is the same as the
/// one generated for the first MessageDeduplicationId
, the two messages
/// are treated as duplicates and only one copy of the message is delivered.
The MessageDeduplicationId
is available to the consumer of the message
/// (this can be useful for troubleshooting delivery issues).If a message is sent successfully but the acknowledgement is lost and the message
/// is resent with the same MessageDeduplicationId
after the deduplication
/// interval, Amazon SQS can't detect duplicate messages.Amazon SQS continues to keep track of the message deduplication ID even after the
/// message is received and deleted.The maximum length of MessageDeduplicationId
is 128 characters. MessageDeduplicationId
/// can contain alphanumeric characters (a-z
, A-Z
, 0-9
)
/// and punctuation (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
).For best practices of using MessageDeduplicationId
, see Using
/// the MessageDeduplicationId Property in the Amazon SQS Developer Guide.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public System.String MessageDeduplicationId { get; set; }
#endregion
#region Parameter MessageGroupId
///
///
/// This parameter applies only to FIFO (first-in-first-out) queues.The tag that specifies that a message belongs to a specific message group. Messages
/// that belong to the same message group are processed in a FIFO manner (however, messages
/// in different message groups might be processed out of order). To interleave multiple
/// ordered streams within a single queue, use MessageGroupId
values (for
/// example, session data for multiple users). In this scenario, multiple consumers can
/// process the queue, but the session data of each user is processed in a FIFO fashion.- You must associate a non-empty
MessageGroupId
with a message. If you
/// don't provide a MessageGroupId
, the action fails. ReceiveMessage
might return messages with multiple MessageGroupId
/// values. For each MessageGroupId
, the messages are sorted by time sent.
/// The caller can't specify a MessageGroupId
.
The length of MessageGroupId
is 128 characters. Valid values: alphanumeric
/// characters and punctuation (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)
.For best practices of using MessageGroupId
, see Using
/// the MessageGroupId Property in the Amazon SQS Developer Guide.MessageGroupId
is required for FIFO queues. You can't use it for Standard
/// queues.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public System.String MessageGroupId { get; set; }
#endregion
#region Parameter MessageSystemAttribute
///
///
/// The message system attribute to send. Each message system attribute consists of a
/// Name
, Type
, and Value
.- Currently, the only supported message system attribute is
AWSTraceHeader
.
/// Its type must be String
and its value must be a correctly formatted X-Ray
/// trace header string. - The size of a message system attribute doesn't count towards the total size of a message.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
[Alias("MessageSystemAttributes")]
public System.Collections.Hashtable MessageSystemAttribute { get; set; }
#endregion
#region Parameter QueueUrl
///
///
/// The URL of the Amazon SQS queue to which a message is sent.Queue URLs and names are case-sensitive.
///
///
#if !MODULAR
[System.Management.Automation.Parameter(Position = 0, ValueFromPipelineByPropertyName = true, ValueFromPipeline = true)]
#else
[System.Management.Automation.Parameter(Position = 0, ValueFromPipelineByPropertyName = true, ValueFromPipeline = true, Mandatory = true)]
[System.Management.Automation.AllowEmptyString]
[System.Management.Automation.AllowNull]
#endif
[Amazon.PowerShell.Common.AWSRequiredParameter]
public System.String QueueUrl { get; set; }
#endregion
#region Parameter Select
///
/// Use the -Select parameter to control the cmdlet output. The default value is '*'.
/// Specifying -Select '*' will result in the cmdlet returning the whole service response (Amazon.SQS.Model.SendMessageResponse).
/// Specifying the name of a property of type Amazon.SQS.Model.SendMessageResponse will result in that property being returned.
/// Specifying -Select '^ParameterName' will result in the cmdlet returning the selected cmdlet parameter value.
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public string Select { get; set; } = "*";
#endregion
#region Parameter PassThru
///
/// Changes the cmdlet behavior to return the value passed to the QueueUrl parameter.
/// The -PassThru parameter is deprecated, use -Select '^QueueUrl' instead. This parameter will be removed in a future version.
///
[System.Obsolete("The -PassThru parameter is deprecated, use -Select '^QueueUrl' instead. This parameter will be removed in a future version.")]
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public SwitchParameter PassThru { get; set; }
#endregion
#region Parameter Force
///
/// This parameter overrides confirmation prompts to force
/// the cmdlet to continue its operation. This parameter should always
/// be used with caution.
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public SwitchParameter Force { get; set; }
#endregion
protected override void ProcessRecord()
{
this._AWSSignerType = "v4";
base.ProcessRecord();
var resourceIdentifiersText = FormatParameterValuesForConfirmationMsg(nameof(this.MessageDeduplicationId), MyInvocation.BoundParameters);
if (!ConfirmShouldProceed(this.Force.IsPresent, resourceIdentifiersText, "Send-SQSMessage (SendMessage)"))
{
return;
}
var context = new CmdletContext();
// allow for manipulation of parameters prior to loading into context
PreExecutionContextLoad(context);
#pragma warning disable CS0618, CS0612 //A class member was marked with the Obsolete attribute
if (ParameterWasBound(nameof(this.Select)))
{
context.Select = CreateSelectDelegate(Select) ??
throw new System.ArgumentException("Invalid value for -Select parameter.", nameof(this.Select));
if (this.PassThru.IsPresent)
{
throw new System.ArgumentException("-PassThru cannot be used when -Select is specified.", nameof(this.Select));
}
}
else if (this.PassThru.IsPresent)
{
context.Select = (response, cmdlet) => this.QueueUrl;
}
#pragma warning restore CS0618, CS0612 //A class member was marked with the Obsolete attribute
context.DelayInSeconds = this.DelayInSeconds;
if (this.MessageAttribute != null)
{
context.MessageAttribute = new Dictionary(StringComparer.Ordinal);
foreach (var hashKey in this.MessageAttribute.Keys)
{
context.MessageAttribute.Add((String)hashKey, (MessageAttributeValue)(this.MessageAttribute[hashKey]));
}
}
context.MessageBody = this.MessageBody;
#if MODULAR
if (this.MessageBody == null && ParameterWasBound(nameof(this.MessageBody)))
{
WriteWarning("You are passing $null as a value for parameter MessageBody which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues.");
}
#endif
context.MessageDeduplicationId = this.MessageDeduplicationId;
context.MessageGroupId = this.MessageGroupId;
if (this.MessageSystemAttribute != null)
{
context.MessageSystemAttribute = new Dictionary(StringComparer.Ordinal);
foreach (var hashKey in this.MessageSystemAttribute.Keys)
{
context.MessageSystemAttribute.Add((String)hashKey, (MessageSystemAttributeValue)(this.MessageSystemAttribute[hashKey]));
}
}
context.QueueUrl = this.QueueUrl;
#if MODULAR
if (this.QueueUrl == null && ParameterWasBound(nameof(this.QueueUrl)))
{
WriteWarning("You are passing $null as a value for parameter QueueUrl which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues.");
}
#endif
// allow further manipulation of loaded context prior to processing
PostExecutionContextLoad(context);
var output = Execute(context) as CmdletOutput;
ProcessOutput(output);
}
#region IExecutor Members
public object Execute(ExecutorContext context)
{
var cmdletContext = context as CmdletContext;
// create request
var request = new Amazon.SQS.Model.SendMessageRequest();
if (cmdletContext.DelayInSeconds != null)
{
request.DelaySeconds = cmdletContext.DelayInSeconds.Value;
}
if (cmdletContext.MessageAttribute != null)
{
request.MessageAttributes = cmdletContext.MessageAttribute;
}
if (cmdletContext.MessageBody != null)
{
request.MessageBody = cmdletContext.MessageBody;
}
if (cmdletContext.MessageDeduplicationId != null)
{
request.MessageDeduplicationId = cmdletContext.MessageDeduplicationId;
}
if (cmdletContext.MessageGroupId != null)
{
request.MessageGroupId = cmdletContext.MessageGroupId;
}
if (cmdletContext.MessageSystemAttribute != null)
{
request.MessageSystemAttributes = cmdletContext.MessageSystemAttribute;
}
if (cmdletContext.QueueUrl != null)
{
request.QueueUrl = cmdletContext.QueueUrl;
}
CmdletOutput output;
// issue call
var client = Client ?? CreateClient(_CurrentCredentials, _RegionEndpoint);
try
{
var response = CallAWSServiceOperation(client, request);
object pipelineOutput = null;
pipelineOutput = cmdletContext.Select(response, this);
output = new CmdletOutput
{
PipelineOutput = pipelineOutput,
ServiceResponse = response
};
}
catch (Exception e)
{
output = new CmdletOutput { ErrorResponse = e };
}
return output;
}
public ExecutorContext CreateContext()
{
return new CmdletContext();
}
#endregion
#region AWS Service Operation Call
private Amazon.SQS.Model.SendMessageResponse CallAWSServiceOperation(IAmazonSQS client, Amazon.SQS.Model.SendMessageRequest request)
{
Utils.Common.WriteVerboseEndpointMessage(this, client.Config, "Amazon Simple Queue Service (SQS)", "SendMessage");
try
{
#if DESKTOP
return client.SendMessage(request);
#elif CORECLR
return client.SendMessageAsync(request).GetAwaiter().GetResult();
#else
#error "Unknown build edition"
#endif
}
catch (AmazonServiceException exc)
{
var webException = exc.InnerException as System.Net.WebException;
if (webException != null)
{
throw new Exception(Utils.Common.FormatNameResolutionFailureMessage(client.Config, webException.Message), webException);
}
throw;
}
}
#endregion
internal partial class CmdletContext : ExecutorContext
{
public System.Int32? DelayInSeconds { get; set; }
public Dictionary MessageAttribute { get; set; }
public System.String MessageBody { get; set; }
public System.String MessageDeduplicationId { get; set; }
public System.String MessageGroupId { get; set; }
public Dictionary MessageSystemAttribute { get; set; }
public System.String QueueUrl { get; set; }
public System.Func Select { get; set; } =
(response, cmdlet) => response;
}
}
}